ActionScript 3
Работа с объектами отображения
Поиск…
Синтаксис
-
addChild(child)
- добавляет новый элемент в дочернее дерево этого объекта в качестве верхнего элемента. -
addChildAt(child, index)
- добавляет новый элемент в дочернее дерево этого объекта в указанной позиции. Самый нижний элемент имеет индекс 0. -
getChildAt(index)
- возвращает дочерний элемент с заданным индексом. -
getChildIndex(child)
возвращает индекс прямого дочернего элемента этого объекта. В противном случае создается исключение. -
removeChild(child)
- удаляет указанный прямой дочерний элемент из дочернего дерева этого объекта. Выдает исключение, если родительский родитель этого ребенка не равенthis
. -
removeChildAt(index)
- удаляет дочерний элемент, выбранный по индексу вместо ссылки. Выдает исключение, если дочернее дерево не является таким широким. -
removeChildren(beginIndex:int = 0, endIndex:int = 0x7fffffff))
- добавлен в Flash Player 11, удаляет подмножество детей по диапазону индексов или всех дочерних, еслиremoveChildren(beginIndex:int = 0, endIndex:int = 0x7fffffff))
без параметров. -
setChildIndex(child,index)
- изменяет индекс ребенка на новое значение, перемещая всех детей между ними, чтобы занять освобожденное место. -
swapChildren(child1,child2)
- свопит позиции двух детей в список отображения, не влияя на позиции других детей. -
swapChildrenAt(index1,index2)
-swapChildrenAt(index1,index2)
детей, расположенных по их индексам.
замечания
Список отображения фактически является деревом и визуализируется с использованием первого алгоритма глубины. Любой объект, указанный ранее, будет отображаться ранее и может быть скрыт объектами, перечисленными позже. Все методы, которые можно использовать против дерева, можно применять для работы со списком отображения.
Введение в список отображения
В AS3 отображаемые активы не отображаются до тех пор, пока они не будут добавлены в список отображения.
Время выполнения AIR / Flash имеет иерархическую структуру отображения (отношения родительского ребенка, в которой дети могут иметь своих собственных детей), причем эта stage
является родителем верхнего уровня.
Чтобы добавить что-то в список отображения, вы используете addChild
или addChildAt
. Вот основной пример рисования круга и его добавления в список отображения:
var myCircle:Shape = new Shape();
myCircle.graphics.beginFill(0xFF0000); //red
myCircle.graphics.drawCircle(25, 25, 50);
myCircle.graphics.endFill();
this.addChild(myCircle); //add the circle as a child of `this`
Чтобы увидеть объект в приведенном выше примере, this
(контекст кода) также должно быть в списке отображения, а также любых родителях, которых оно может иметь. В AS3 эта stage
является самой главной родительской.
Объекты отображения могут иметь только один родитель. Поэтому, если у ребенка уже есть родительский элемент, и вы добавляете его к другому объекту, он будет удален из предыдущего родителя.
Z-Order / Layering
Допустим, вы скопировали код из предыдущего примера, так что у вас было 3 круга:
var redCircle:Shape = new Shape();
redCircle.graphics.beginFill(0xFF0000); //red
redCircle.graphics.drawCircle(50, 50, 50); //graphics.endFill is not required
var greenCircle:Shape = new Shape();
greenCircle.graphics.beginFill(0x00FF00); //green
greenCircle.graphics.drawCircle(75, 75, 50);
var blueCircle:Shape = new Shape();
blueCircle.graphics.beginFill(0x0000FF); //blue
blueCircle.graphics.drawCircle(100, 100, 50);
this.addChild(redCircle);
this.addChild(greenCircle);
this.addChild(blueCircle);
Поскольку метод addChild
добавляет ребенка поверх всего остального в том же родителе, вы получите этот результат с элементами, расположенными в том же порядке, в котором вы используете addChild:
Если вы хотите, чтобы ребенок был многослойным относительно своих братьев и сестер, вы можете использовать addChildAt
. С помощью addChildAt
вы передаете другой параметр, указывающий индекс (z-порядок), на котором должен находиться ребенок. 0
является самым нижним положением / слоем.
this.addChild(redCircle);
this.addChild(greenCircle);
this.addChildAt(blueCircle,0); //This will add the blue circle at the bottom
Теперь синий круг находится под его братьями и сестрами. Если позже вы хотите изменить индекс дочернего элемента, вы можете использовать метод setChildIndex
(для родителя ребенка).
this.setChildIndex(redCircle, this.numChildren - 1); //since z-index is 0 based, the top most position is amount of children less 1.
Это изменит красный круг, чтобы он был выше всего остального. Приведенный выше код дает тот же результат, что и this.addChild(redCircle)
.
Удаление объектов отображения
Чтобы удалить объекты, у вас есть removeChildAt
методы removeChild
и removeChildAt
а также метод removeChildren
.
removeChild(redCircle); //this will take redCircle off the display list
removeChildAt(0); //this will take the bottom most object off the display list
removeChildren(); //this will clear all children from the display list
removeChildren(1); //this would remove all children except the bottom most
removeChildren(1,3); //this would remove the children at indexes 1, 2 & 3
События
Когда дочерний элемент добавляется в список отображения, некоторые события запускаются с этим дочерним элементом.
-
Event.ADDED
-
Event.ADDED_TO_STAGE
И наоборот, есть также события удаления:
-
Event.REMOVED
-
Event.REMOVED_FROM_STAGE
Adobe Animate / Flash Professional
При работе с временными рамками FlashProfessional / Adobe Animate добавление чего-то к временной шкале автоматически обрабатывает нюансы отображения. Они автоматически добавляются и удаляются из списка отображения по временной шкале.
Однако хорошо иметь в виду, что:
Если вы управляете кодом с помощью родительского элемента экранного объекта, созданного временной шкалой (с помощью addChild / setChildIndex), этот ребенок больше не будет удален автоматически по временной шкале и должен быть удален с помощью кода.
Расслоение
Могут возникнуть ситуации, когда вы решаете, что один набор экранных объектов всегда должен быть выше другого набора объектов, например, стрелки над головами, взрывы над чем-то, что только что взорвалось, и т. Д. Чтобы выполнить это как можно проще, вам нужно назначить и создайте набор Sprite
s, расположите их по порядку снизу вверх, затем просто добавьте все объекты «выше», установленные на слой выше того, который используется для объектов «ниже».
var monsters:Vector.<Monster>;
var bullets:Vector.<Bullet>; // desired: bullets strictly above monsters
var monsterLayer:Sprite=new Sprite();
var bulletLayer:Sprite=new Sprite();
addChild(monsterLayer);
addChild(bulletLayer);
Затем, когда вы добавляете Monster
в список отображения, добавьте его в monsterLayer
, и всякий раз, когда вы добавляете Bullet
, добавьте bulletLayer
для достижения желаемого эффекта.
Удалить все объекты из списка отображения
Если вы используете Flash Player 11+, встроенный метод removeChildren - лучший способ удалить всех детей:
removeChildren(); //a start and end index can be passed
Для устаревших приложений то же самое можно сделать с помощью цикла:
while (numChildren > 0) {
removeChildAt(0);
}
Переход от кадров к переключению содержимого вручную
Раньше разработчик Flash использовал фреймы, поскольку они изначально доступны в Flash-проигрывателе, для размещения различных экранов их приложения (чаще всего это игра). В конце концов они могут наткнуться на проблему, что что-то пошло не так, потому что они использовали фреймы и не обратили внимания на трудности, которые возникают из-за этого, и ищут способы как сохранить структуру кадров, так и устранить препятствие использования фреймов с его осложнениями. Решение состоит в том, чтобы использовать классы потомков Sprite
или экспортировать фреймы в качестве MovieClip
с одним фреймом (для тех, которые разрабатываются в Adobe Flash CS), и вручную переключать содержимое с помощью addChild()
и removeChild()
.
Класс менеджера должен иметь все классы дочерних фреймов, и всякий раз, когда вызывается переход, можно использовать функцию, подобную этой:
var frames:Vector.<DisplayObject>; // this holds instances to ALL children
var currentFrame_alt:int; // current frame. Can't use the property
function changeFrame(frame:int):void {
removeChild(frames[currentFrame_alt]);
addChild(frames[frame]);
currentFrame_alt=frame;
}
Все дети могут одновременно отправку и слушать события с Event.ADDED_TO_STAGE
, используемых в качестве точки входа для все , что происходит после того, как gotoAndStop()
ориентируется этот кадром, и любые исходящие переходы могут быть закодированы как события , основанных на строках, которые прослушивают в Main
классе, который затем выполняет переход.
frames[0].addEventListener("startGame",startGame); // assuming frame 0 is a "Play" button
function startGame(e:Event):void {
changeFrame(1); // switch to frame 1 - will display frames[1]
}
Конечно, набор строк должен быть предопределен, например, на экране ввода может быть две кнопки для запуска игры: «Начать игру» и «Начать приглушение», например, и кнопки должны отправлять разные события, которые затем будут обрабатываться по-разному в классе менеджера.
Этот шаблон может быть настолько глубоким, насколько вам нужно. Если какой-либо кадр проекта содержит MovieClip с несколькими кадрами, он также может быть разделен на спрайты с помощью этого метода.