Руководство по actionscript. часть 3, стр. 135
For (var i:int=0; i < numchildren; i++) { getchildat(i).rotation = math.floor(math.random( )*360);
}
}
}
}
Чтобы обращаться не только к непосредственным детям контейнера, но и ко всем его потомкам, мы интегрируем предыдущий цикл for в рекурсивную функцию. В листинге 20.4 представлен общий подход.
Листинг 20.4. Рекурсивный обход дерева списка отображения
public function processChildren (container:DisplayObjectContainer):void { for (var i;int = 0; i < container.numchildren; i++) { // обрабатываем ребенка здесь. например, следующая строка выводит // строковое значение данного ребенка на консоль, var thischiid:displayobject = container.getchildat(i); trace(thischild.tostring( ));
// Если этот ребенок сам по себе является контейнером, приступаем // к обработке его детей, if (thisChild is DisplayObjectContainer) { processChi1dren(DisplayObjectContaiпег(thisChi1d));
}
}
}
Следующая функция rotateChildren ( ) использует обобщенный код из листинга 20.4. Она случайным образом поворачивает всех потомков указанного контейнера (а не только детей). Однако обратите внимание на небольшое изменение в подходе, представленном в листинге 20.4: функция rotateChildren ( ) вращает только тех детей, которые не являются контейнерами.
public function rotateChildren (contaiпег[DisplayObjectContainer):void { for (var i:int = 0; i < container.numchildren; i++) { var thi schi1d:di splayobject = container.getchi1dat(i); if (thischild is displayobjectcontainer) {
rotateChi1dren(Di splayObjectContai ner(thi sChiId)); } else {
thisChild. rotation = Math. f1oor(Math. random( )*360);
}
}
}
Управление одновременно несколькими объектами в контейнерах
Ранее в разд. «Обзор API отображения» было сказано, что дочерние объекты автоматически перемещаются, вращаются и трансформируются при перемещении, вращении и трансформировании их предков. Мы можем использовать эту возможность для выполнения коллективных визуальных модификаций над группами объектов. Чтобы познакомиться с этой методикой, создадим два экземпляра класса Shape, представляющих прямоугольники, в экземпляре класса Sprite:
// Создаем два прямоугольника
var recti:Shape = new Shape( ):
recti. graphi cs.1i neSty1e(1):
recti. graphics. beginFill(OxOOOOFF, 1);
recti. graphics. drawRect(0, 0, 75, 50);
var rect2:Shape = new Shape( ):
rect2.graphi cs.1i neSty1e(1);
rect2.graphics. beginFill(OxFFOOOO, 1):
rect2.graphics. drawRect(0, 0, 75, 50);
rect2.x = 50;
rect2.y = 75;
// Создаем контейнер
var group:Sprite = new Sprite( );
// Добавляем прямоугольники в контейнер group. addChiId(recti); group. addChiId(rect2);
// Добавляем контейнер в основное приложение некоеОсновноеПриложение. addChi1d(group);
На рис. 20.13 показан результат выполнения предыдущего кода.