Поиск…


Синтаксис

  1. addChild(child) - добавляет новый элемент в дочернее дерево этого объекта в качестве верхнего элемента.
  2. addChildAt(child, index) - добавляет новый элемент в дочернее дерево этого объекта в указанной позиции. Самый нижний элемент имеет индекс 0.
  3. getChildAt(index) - возвращает дочерний элемент с заданным индексом.
  4. getChildIndex(child) возвращает индекс прямого дочернего элемента этого объекта. В противном случае создается исключение.
  5. removeChild(child) - удаляет указанный прямой дочерний элемент из дочернего дерева этого объекта. Выдает исключение, если родительский родитель этого ребенка не равен this .
  6. removeChildAt(index) - удаляет дочерний элемент, выбранный по индексу вместо ссылки. Выдает исключение, если дочернее дерево не является таким широким.
  7. removeChildren(beginIndex:int = 0, endIndex:int = 0x7fffffff)) - добавлен в Flash Player 11, удаляет подмножество детей по диапазону индексов или всех дочерних, если removeChildren(beginIndex:int = 0, endIndex:int = 0x7fffffff)) без параметров.
  8. setChildIndex(child,index) - изменяет индекс ребенка на новое значение, перемещая всех детей между ними, чтобы занять освобожденное место.
  9. swapChildren(child1,child2) - свопит позиции двух детей в список отображения, не влияя на позиции других детей.
  10. 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 с несколькими кадрами, он также может быть разделен на спрайты с помощью этого метода.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow