Руководство по actionscript. часть 3, стр. 126

Следующий код изменяет последовательность, добавляя сначала круг, затем прямоугольник и после этого — текст. На рис. 20.6 показан результат. Обратите внимание, как простое изменение последовательности, с учетом которой добавляются объекты, влияет на конечный результат.

addChild(circle); // Глубина О

addChiId(rect); // Глубина 1

addChi1d(greeting_txt); // Глубина 2

Рассмотрим еще один пример. Следующий код сначала добавляет текст, затем окружность и после нее — прямоугольник. На рис. 20.7 показан результат.

addChiId(greeting_txt): // Глубина О addChild(circle): // Глубина 1

addChild(rect): // Глубина 2

Рис. 20.5. Прямоугольник, Рис. 20.6. Круг, Рис. 20.7. Текст, круг,

круг, текст прямоугольник, текст прямоугольник

Для того чтобы получить позицию глубины любого объекта в контейнере отображаемых объектов, нужно использовать метод экземпляра getChildlndex ( ) класса DisplayObjectContainer:

trace(getChildlndex(rect)); // Выводит: 2

Чтобы добавить новый объект в определенную позицию глубины, используется метод экземпляра addChildAt ( ) класса DisplayObjectContainer (обратите внимание: addChildAt ( ), а не addChild ( ) ). Этот метод принимает следующий вид:

контейнер. addChi 16М(отображаемый0бьект. позиция Гпубины)

Значение параметра позиция Гпубины должно находиться в пределах от 0 до значения контейнер. numChildren включительно.

Если указанная позиция позиция Гпубины уже занята существующим ребенком, объект отображаемыйОбъект будет помещен позади этого существующего объекта (то есть позиции глубины всех отображаемых объектов, которые равны указанному значе-

нию или выше его, увеличиваются на единицу, чтобы освободить место для нового ребенка).

Руководство по actionscript. часть 3, стр. 127

^ I Повторяйте про себя это мнемоническое правило метода addChildAt(): «Если глубина *г А, в занята, новый ребенок помещается позади».

_ _

Для добавления нового объекта поверх всех существующих детей используется следующий код:

контейнер. addChi 1 АМШображаемыйОбъект. контейнер. numChi 1 dren) что аналогично следующей записи: контейнер. addChi 16(отображаемый0бъект)

Обычно метод addChildAt ( ) применяется совместно с методом экземпляра getChildlndex ( ) класса DisplayOb j ectContainer для добавления объекта ниже существующего ребенка в заданном контейнере. Вот общий формат:

контейнер. addChi 1 dAt(новыйРебенок.

контейнер. де1Ш161г\6ех(существующийРебенок))

Испытаем этот подход, добавив новый треугольник позади круга в приложении GreetingApp, используя самое последнее воплощение данного приложения, изображенное на рис. 20.7.

Рассмотрим код, который создает треугольник:

var triangle:Shape = new Shape( ); tri angle. graphi cs.1ineSty1e(1); triangle. graphics. beginFill(OxOOFFOO. 1); triangle. graphics. moveTo(25. 0): triangle. graphics. lineTo(50. 25): triangle. graphics. lineToCO. 25): triangle. graphics. lineToC25. 0): triangle. graphics. endFill( ); triangle. x = 25: triangle. у = 10:

Теперь рассмотрим код, который делает объект triangle новым ребенком экземпляра класса GreetingApp, размещая его ниже существующего объекта circle (обратите внимание, что методы addChildAt ( ) и getChildlndex ( ) неявно вызываются над текущим объектом GreetingApp). На рис. 20.8 показаны результаты.

addChi1dAt(triangle. getChildlndex(circle)):

Рис. 20.8. Новый ребенок-треугольник

Как недавно было сказано, когда новый объект добавляется в позицию глубины, занятую существующим ребенком, позиции глубины существующего ребенка и всех

детей, расположенных выше его, увеличиваются на единицу. Новый объект затем занимает позицию глубины, которая была освобождена существующим ребенком. Например, перед добавлением объекта triangle глубины детей экземпляра класса GreetingApp выглядели следующим образом:

После добавления объекта triangle позиция глубины объекта circle изменилась с 1 на 2, позиция глубины объекта rect — с 2 на 3, а объект triangle занял глубину 1 (предыдущая глубина объекта circle). Между тем позиция глубины объекта greet ing txt не изменилась, поскольку с самого начала она была меньше глубины объекта circle. Вот измененные глубины после добавления объекта triangle:

greeting_txt О triangle 1 circle 2 rect 3

Чтобы изменить глубину существующего ребенка, мы можем поменять местами позиции глубины этого ребенка и другого существующего ребенка с помощью методов экземпляра swapChildren ( ) или swapChildrenAt ( ) класса DisplayObjectContainer. Можно также непосредственно задать глубину для этого ребенка, используя метод экземпляра setChildlndex ( ) класса DisplayObj ectContainer.

Руководство по actionscript. часть 3, стр. 128

Метод swapChildren ( ) принимает следующий вид:

контейнер. swapChi16геп(существующийРебенок1, существующийРебенок2):

Здесь существующийРебенок1 и существующийРебенок2 — дочерние объекты контейнера контейнер. Метод swapChildren ( ) меняет местами глубины объектов существу — ющийРебенок1 и сущее твующийРебенок2. На обычном языке приведенный код означает следующее: «Поместить объект существующийРебенок1 на глубину, занимаемую объектом сущее твующийРебе но к2, и поместить объект существующийРебенок2 на глубину, занимаемую объектом существующийРебенок1».

Метод swapChildrenAt ( ) принимает следующий вид:

контейнер. swapChi1drenAt(существующаяГпубина1, существующаяГпубина2);

Здесь существующая Глуби на 1 и существующаяГлубина2 — глубины, занимаемые детьми контейнера контейнер. Метод swapChildrenAt ( ) меняет местами глубины детей, находящихся на глубинах существующаяГ’лубина! и существующаяГлубина2. На обычном языке предыдущий код означает следующее: «Поместить ребенка, который в настоящий момент находится на глубине существующаяГлубина!, на глубину существующаяГпубина2у а ребенка, который в настоящий момент находится на глубине существующаяГпубина2, поместить на глубину существующаяГпубина1».

Метод setChildlndex ( ) принимает следующий вид:

контейнер.$е1С№~\61г\6ех(существующийРебенок. новаяПозицияГлубины);

greeting_txt

circle

rect

О 1

2

Здесь существующийРебенок — ребенок контейнера контейнер. Позиция новаяПозиция-Гпубины должна быть позицией глубины, в настоящий момент занимаемой объектом-ребенком контейнера контейнер. Иными словами, метод setChildlndex ( ) позволяет только изменять позиции существующих объектов-детей, но не позволяет добавлять новые позиции глубины. Значение параметра новаяПозицияГпубины метода setChildlndex ( ) обычно получают вызовом метода getChildlndex ( ) над существующим ребенком, как показано в следующем коде:

контейнер. setChi ]6Шех(существующийРебенок1.

Руководство по actionscript. часть 3, стр. 129

Контейнер. getCh i1dIndex(сущеетвующийРебенок2)):

Это означает: «Поместить ребенка существующийРебенок1 на глубину, которая в настоящий момент занята ребенком существующийРебенок2».

Стоит отметить, что, когда глубина объекта увеличивается на новую позицию с помощью метода setChildlndex ( ) (то есть объект перемещается выше), глубина всех объектов, находящихся между старой и новой позициями, уменьшается на 1, тем самым заполняя освободившуюся позицию в результате перемещения объекта. Таким образом, перемещенный объект появляется перед объектом, который раньше находился в указанной новой позиции. Например, продолжая работу над последней версией приложения GreetingApp (которая была показана на рис. 20.8), изменим позицию глубины объекта greet ing_txt с 0 на 2. До выполнения следующего кода позицию глубины 2 занимает объект circle.

setChildlndex(greeting_txt. getChildlndex(circle));

Когда объект greeting_txt перемещается в позицию глубины 2, позиции глубины объектов circle и triangle уменьшаются до 1 и 0 соответственно, поэтому объект greet ing txt отображается перед этими объектами. Результаты показаны на рис. 20.9.

В отличие от этого, когда глубина объекта уменьшается на новую позицию с помощью метода setChildlndex ( ) (то есть объект перемещается ниже), позиция глубины всех объектов, находящихся в новой позиции или выше ее, увеличивается на 1, тем самым освобождая пространство для нового объекта. Таким образом, перемещенный объект появляется позади объекта, который раньше находился в указанной новой позиции (как если бы объект был добавлен с помощью метода addChildAt ( ) ). Обратите внимание на важное различие между перемещением объекта на высокую глубину и перемещением объекта на низкую глубину.

Рис. 20.9. Перемещение текста вверх

Н®1

Объект, перемещенный на большую глубину, отображается перед объектом, который находился в целевой позиции, однако объект, перемещенный на меньшую глубину, отображается позади объекта, который находился в целевой позиции.

Например, продолжая работать над кодом, результаты выполнения которого показаны на рис. 20.9, изменим позицию глубины объекта rectc3Hal(l — это глубина, в настоящий момент занимаемая объектом circle):

setChildlndex(rect. getChi 1 dlndex(c»ircle)):

Когда объект rect перемещается в позицию глубины 1, позиции глубины объектов circle и greet ing txt увеличиваются до 2 и 3 соответственно, поэтому объект rect отображается позади этих объектов (как показано на рис. 20.10).

Чтобы поместить объект поверх всех объектов в данном контейнере, используйте следующий код:

контейнер. setChi1dlndexCсущеетвующийРебенок. контейнер. numChildren-1)

Например, следующий код помещает треугольник поверх всех дочерних объектов экземпляра класса GreetingApp (код используется в классе GreetingApp, поэтому объект контейнер в предыдущем выражении опускается и неявно преобразуется в this — текущий объект): setChi1dlndex(trianglе. numChildren-1); На рис. 20.11 показаны результаты выполнения кода.

Руководство по actionscript. часть 3, стр. 130

Вы сможете легко разобраться с поведением метода setChildlndex ( ), если представите детей объекта DisplayObjectContainer в виде колоды карт, как уже говорилось ранее. Если вы перемещаете нижнюю карту колоды вверх, остальные карты смещаются вниз (то есть карта, которая находилась поверх нижней карты, сама становится новой нижней картой). Если вы перемещаете верхнюю карту колоды вниз, остальные карты смещаются вверх (то есть карта, которая была нижней, теперь будет находиться поверх новой нижней карты).

Для удаления объекта из контейнера объектов отображения используется метод экземпляра removeChild ( ) класса DisplayOb j ectContainer, который принимает следующий вид:

контейнер. removeChi16(существующийРебенок)

Здесь контейнер — это контейнер, который в настоящий момент содержит объект сущее твующийРебенок. Например, чтобы удалить треугольник из экземпляра класса GreetingApp, мы бы использовали следующий код:

removeChild(triangle):

В качестве альтернативы мы можем удалить ребенка, используя его глубину, с помощью метода removeChildAt ( ), который принимает следующий вид:

контейнер. removeChi1dAt(глубина)

Рис. 20.10. Перемещение прямоугольника вниз

Рис. 20.11. Треугольник перемещен вперед

Удаление элементов из контейнеров

После выполнения метода removeChi Id ( ) или removeChi IdAt ( ) переменной parent удаленного объекта присваивается значение null, поскольку удаленный ребенок больше не имеет контейнера. Если удаленный ребенок находился в списке отображения перед вызовом метода removeChi Id ( ) или removeChi IdAt ( ), он удаляется из этого списка. Если удаленный ребенок отображался на экране перед вызовом метода removeChild ( ) или removeChildAt ( ), он также удаляется с экрана. Если удаленный ребенок является объектом DisplayOb j ectContainer со своими детьми, его дети будут также удалены с экрана.

Удаление элементов из памяти

Важно отметить, что методы removeChild ( ) и removeChildAt ( ), рассмотренные в предыдущем разделе, не обязательно приводят к уничтожению удаленного объекта в памяти; они только удаляют объект из иерархии отображения родительского объекта DisplayObjectContainer. Если на удаленный объект ссылается переменная или элемент массива, то этот объект продолжает существовать и может быть в дальнейшем заново добавлен в другой контейнер. Например, рассмотрим следующий код, который создает объект Shape, присваивает его переменной rect и затем добавляет этот объект в иерархию отображения объекта parent:

var rect:Shape = new Shape( ): rect. graphi cs.1i neStyle(1): rect. graphi cs. begi nFi11(OxOOOOFF, 1); rect. graphics. drawRect(0, 0. 75, 50): parent. addChild(rect):

Если теперь мы воспользуемся методом removeChild ( ), чтобы удалить объект Shape из объекта parent, переменная rect будет по-прежнему ссылаться на объект Shape:

parent. removeChi1d(rect):

trace(rect): // Выводит: [object Shape]

До тех пор пока переменная rect существует, мы можем использовать ее для повторного добавления объекта Shape в иерархию отображения объекта parent, как показано в следующем коде:

parent. addChild(rect);

Чтобы полностью удалить отображаемый объект из программы, мы должны удалить не только его с экрана с помощью метода removeChild ( ), но и все ссылки на него. Чтобы удалить все ссылки на объект, мы должны вручную удалить его из всех массивов, содержащих этот объект, и присвоить значение nu 11 (или любое другое значение) всем переменным, которые ссылаются на него. Как только все ссылки на объект будут удалены, он становится доступным для сборки мусора и в определенный момент будет удален из памяти сборщиком мусора языка ActionScript.

Руководство по actionscript. часть 3, стр. 131

Однако, как уже говорилось в гл. 14, даже после того, как все ссылки на объект будут удалены, он продолжает быть активным до тех пор, пока сборщик мусора не удалит его из памяти. Например, если объект зарегистрировал приемники для события Event. ENTER FRAME, то это событие будет по-прежнему приводить к выполт нению кода. Подобным образом, если объект запустил таймеры, используя метод

setlnterval ( ) иликласс Time г, эти таймеры будут по-прежнему приводить к выполнению кода. Точно так же, если объект является экземпляром класса MovieClip, воспроизводимым в настоящий момент, его головка воспроизведения будет продолжать перемещаться, приводя к выполнению существующих сценариев кадров.

Пока объект ожиДает начала процесса сборки мусора, приемники событий, таймеры и сценарии кадров могут вызывать незапланированное выполнение кода, приводя к расходованию памяти или к нежелательным побочным эффектам.

Чтобы избежать нежелательного выполнения кода при удалении отображаемого объекта из программы, убедитесь, что вы полностью деактивировали этот объект перед тем, как освободить все ссылки на него. Дополнительную информацию о деактивации объектов можно найти в гл. 14.

Всегда деактивируйте отображаемые объекты перед их уничтожением.

Удаление всех детей

Язык ActionScript не предоставляет прямого способа для удаления всех детей объекта. Следовательно, чтобы удалить всех отображаемых детей из конкретного объекта, мы должны использовать циклы while или for. Например, следующий код использует цикл while для удаления всех детей объекта родитель в направлении снизу вверх. Сначала удаляется ребенок на глубине 0, затем глубина всех детей уменьшается на 1, после этого удаляется новый ребенок на глубине 0, и этот процесс повторяется до тех пор, пока у объекта не останется детей.

// Удаляем всех детей — объекта родитель while (родитель. numChildren > 0) { родитель. removeChiIdAt(0);

}

Следующий код также удаляет всех детей объекта родитель, но в направлении сверху вниз.. Однако использования такого кода следует избегать, поскольку он медленнее предыдущего, применяемого для удаления детей в направлении снизу вверх.

while (родитель. numChildren > 0) { родитель. removeChiIdAt(родитель. numChi 1 dren-1);

}

Следующий код удаляет всех детей в направлении снизу вверх с помощью цикла for вместо цикла while:

for (:numChildren > 0:) { родитель. removeChiIdAt(0):

}

Если вам потребуется удалить детей в направлении сверху вниз (возможно, для того, чтобы обработать их в таком порядке перед удалением), будьте осторожны, чтобы не использовать цикл, в котором значение счетчика не уменьшается, а увеличивается. Например, никогда не используйте код наподобие следующего:

// ВНИМАНИЕ: ПРОБЛЕМНЫЙ КОД! НЕ ИСПОЛЬЗОВАТЬ!

for (var i:int = 0: i < родитель.numchildren: i++) { родитель .removechi1dat(i):

}

Что же неправильно с предыдущим циклом for? Представьте, что у объекта родитель есть три ребенка — А, В и С, — которые находятся на глубинах 0,1 и 2 соответственно:

Дети Глубины А 0 В 1

С 2

Когда цикл выполняется в первый раз, значение счетчика i равно 0, поэтому удаляется объект А. После удаления объекта А глубины объектов В и С автоматически уменьшаются на 1, таким образом, глубина объекта В теперь равна 0, а глубина объекта С — 1:

Дети Глубины В 0 С 1

Когда цикл выполняется во второй раз, значение счетчика i равно 1, поэтому удаляется объект С. После удаления объекта С значение переменной роди тель. numChildren становится равным 1 и цикл завершается, поскольку значение переменной i перестает быть меньше значения переменной родитель. numChildren. Но объект В никогда не будет удален!

Изменение родителей элементов

В языке ActionScript версии 3.0 удаление ребенка из одного экземпляра объекта DisplayOb j ectContainer и его перенос в другой экземпляр является совершенно допустимой и распространенной операцией. На самом деле действие по добавлению объекта в контейнер приводит к автоматическому удалению этого объекта из любого контейнера, в котором он находился до настоящего момента.

Руководство по actionscript. часть 3, стр. 132

Чтобы продемонстрировать эту методику, в листинге 20.2 представлено простое приложение WordHighlighter, в котором объект Shape (присвоенный переменной bgRect) перемещается между двумя экземплярами класса Sprite (присвоенными переменным wordl и word2). Экземпляры класса Sprite содержат экземпляры класса TextField (присвоенные переменным textl и text2), которые отображают слова Продукты и Услуги. Объект Shape — это прямоугольник с закругленными углами, который служит для выделения слова, находящегося в настоящий момент под указателем мыши, как показано на рис. 20.12. Когда указатель мыши находится над одним из экземпляров класса TextField, объект Shape перемещается в тот экземпляр класса Shape, который содержит данный объект TextField.

[ Продукты ] Услуги

Рис. 20.12. Перемещение объекта между контейнерами

Мы еще не рассматривали методики обработки событий мыши, которые применяются в листинге 20.2. Информацию об обработке событий ввода можно найти в гл. 22.

Листинг 20.2. Перемещение объекта между контейнерами

package { import flash. display.*; import flash. text.*; import flash. events.*;

public class WordHighlighter extends Sprite { // Первое слово private var wordliSprite; private var textl:TextField;

// Второе слово

private var word2:Sprite;

private var text2:TextField;

// Выделяющая фигура private var bgRect:Shape;

public function WordHighlighter ( ) { // Создаем первый объект TextField и Sprite wordl = new Sprite( ); textl = new TextField( ); textl. text = «Products»; textl. selectable = false; textl. autoSize = TextFieldAutoSize. LEFT; wordl. addChild(textl)

textl. addEventLi stener(MouseEvent. M0USE_0VER, mouseOverLi stener);

// Создаем второй объект TextField и Sprite

word2 = new Sprite( );

text2 = new TextField( );

text2.text = «Services»;

text2.selectable = false;

text2.autoSize = TextFieldAutoSize. LEFT;

word2.x = 75;

word2.addChild(text2)

text2. addEventLi stener (MouseEvent. MOUSEJMR, mouseOverLi stener);

// Добавляем экземпляры класса Sprite в иерархию отображения // объекта WordHighlighter addChild(wordl); addChild(word2);

// Создаем объект Shape (прямоугольник с закругленными углами)

bgRect = new ShapeC );

bgRect. graphi cs.1i neStyle(1);

bgRect. graphi cs. begi nFi11(OxCCCCCC, 1);

bgRect. graphics. drawRoundRectC0. 0. 60. 15, 8);

}

// Вызывается при перемещении указателя мыши над текстовым полем, private function mouseOverListener (e:MouseEvent):void {

// Если родительский объект Sprite экземпляра объекта TextField

// не содержит выделяющую фигуру, перемещаем фигуру в этот объект.

Руководство по actionscript. часть 3, стр. 133

// DisplayObjectContaiпег. contains( ) возвращает true, если указанный

// объект является потомком данного контейнера.

if (!е. target. parent. contains(bgRect)) { e. target. parent. addChi1dAt(bgRect. 0);

}

}

}

}

В таком виде код из листинга 20.2 всегда оставляет выделенным одно из текстовых полей. Для удаления выделения при выходе указателя мыши за пределы обоих текстовых полей мы должны сначала зарегистрировать приемник в обоих текстовых полях для получения события MouseEvent. MOUSE_OUT:

textl. addEventLi stener(MouseEvent. M0USE_0UT. mouseOutLi stener); text2.addEventLi stener(MouseEvent. M0USE_0UT, mouseOutLi stener);

Затем нам придется реализовать код, который удаляет прямоугольник в ответ на событие MouseEvent. MOUSE_OUT:

private function mouseOutListener (e:MouseEvent):void { // Если выделение присутствует… if (e. target. parent. contains(bgRect)) { // …удаляем его

e. target. parent. removeChi1d(bgRect):

}

}

Обход объектов в иерархии отображения

Обход объектов в иерархии отображения означает систематическое обращение к некоторым или ко всем дочерним объектам контейнера, в основном для обработки этих объектов.

Руководство по actionscript. часть 3, стр. 134

Для обращения к непосредственным детям контейнера (но не к правнукам или к любым другим детям-потомкам) используется инструкция цикла. Цикл обрабатывает каждую позицию глубины в контейнере. Внутри тела цикла мы обращаемся к каждому peбeнкyпoeгoпoзицииглyбины, иcпoльзyямeтoдэкзeмпляpagetChildAt ( ) класса DisplayObjectContainer. Следующий код демонстрирует общий подход; он отображает строковые значения всех объектов, содержащихся в объекте контейнер:

for (var i:int=0; i < контейнер.numchildren; i++) { trace(kowre/fwep.getchildat(i).tostring( ));

}

В листинге 20.3 приведено более конкретное и слегка причудливое приложение для обхода отображаемых дочерних объектов. Оно создает 20 экземпляров класса

Shape, содержащих прямоугольники, и затем использует описанный подход для обхода объектов, чтобы выполнять вращение этих экземпляров, когда на них щелкают кнопкой мыши. Код, осуществляющий обход, выделен полужирным шрифтом. В следующих разделах мы рассмотрим приемы векторного рисования и обработки событий мыши, применяемые в этом примере.

Листинг 20.3. Вращение прямоугольников

package { import flash. display.*; import flash. events.*;

public class RotatingRectangles extends Sprite { public function RotatingRectangles ( ) { // Создаем 20 прямоугольников var rects;Array = new Array( ); for (var i:int = 0; i < 20; i++) { rects[i] = new shape( ); rects[i].graphi cs.1i nesty1e(1);

rects[i].graphi cs. begi nFi11(Math. f1oor(Math. random( )*0xFFFFFF), 1) ;

rects[i]. graphi cs. drawRecUO. 0, 100, 50);

rects[i].x = Math. f1oor(Math. random( )*500);

rects[i].y = Math. floor(Math. random( )*400);

addChild(rects[i]);

}

// Регистрируем приемник для щелчков кнопкой мыши

stage. addEventListener(MouseEvent. M0USE_D0WN, mouseDownListener);

}

// Вращает прямоугольники, когда пользователь щелкает кнопкой мыши private function mouseDownListener (e;Event);void {

// Случайным образом вращает каждого отображаемого ребенка

// данного объекта.

Руководство по 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 показан результат выполнения предыдущего кода.



Полезные ссылки
Случайные записи
  • 12.03.2011">Руководство по actionscript. часть 3, стр. 123
  • 13.03.2011">Руководство по actionscript. часть 3, стр. 093
  • 14.03.2011">Руководство по actionscript. часть 3, стр. 081
  • 23.04.2012">Почта Mail.Ru полностью перешла на безопасный протокол HTTPS
  • 11.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.4
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.112
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.129
  • 28.08.2011">Занимайся спортом стар и млад!
  • 13.03.2011">Руководство по actionscript. часть 3, стр. 102
  • 17.07.2010">Подбор цветовой гаммы
  • 28.02.2011">Руководство по actionscript. часть 5, стр. 137
  • 04.03.2011">Руководство по actionscript. часть 5, стр. 046
  • 23.05.2012">Machinima привлекла инвестиций на $35 миллионов благодаря Google
  • 22.01.2011">Руководство по actionscript. часть 1, стр. 105
  • 13.03.2011">Руководство по actionscript. часть 3, стр. 094
Опрос

Какие цвета вы предпочитаете?

View Results

Loading ... Loading ...