Szukaj…


Składnia

  1. addChild(child) - dodaje nowy element do drzewa potomnego tego obiektu jako najwyższy element.
  2. addChildAt(child, index) - dodaje nowy element do drzewa potomnego tego obiektu w określonej pozycji. Najniższy element ma indeks 0.
  3. getChildAt(index) - zwraca dziecko o podanym indeksie.
  4. getChildIndex(child) zwraca indeks bezpośredniego potomka tego obiektu. W przeciwnym razie zgłaszany jest wyjątek.
  5. removeChild(child) - usuwa określone bezpośrednie dziecko z drzewa potomnego tego obiektu. Zgłasza wyjątek, jeśli rodzic dostarczonego dziecka nie równa się this .
  6. removeChildAt(index) - usuwa dziecko wybrane przez indeks zamiast odwołania. Zgłasza wyjątek, jeśli drzewo potomne nie jest tak szerokie.
  7. removeChildren(beginIndex:int = 0, endIndex:int = 0x7fffffff)) - dodany w programie Flash Player 11, usuwa podzbiór dzieci według zakresu indeksu lub wszystkie dzieci, jeśli są wywoływane bez parametrów.
  8. setChildIndex(child,index) - zmienia indeks dziecka na nową wartość, przesuwając wszystkie dzieci między nimi, aby zajmowały zwolnione miejsce.
  9. swapChildren(child1,child2) - zamienia dwie pozycje dzieci na liście wyświetlania, nie wpływając na pozycje innych dzieci.
  10. swapChildrenAt(index1,index2) - zamienia dzieci znajdujące się według ich indeksów.

Uwagi

Lista wyświetlania jest w rzeczywistości drzewem i jest wizualizowana za pomocą algorytmu pierwszej głębokości. Każdy obiekt wymieniony wcześniej zostanie wyświetlony wcześniej i może być zasłonięty przez obiekty wymienione później. Wszystkie techniki, które można zastosować wobec drzewa, można zastosować do pracy z listą wyświetlania.

Wprowadzenie do listy wyświetlania

W AS3 zasoby wyświetlane nie są widoczne, dopóki nie zostaną dodane do listy wyświetlania.

Środowisko wykonawcze AIR / Flash ma hierarchiczną strukturę wyświetlania (relacja rodzicielska, w której dzieci mogą mieć własne dzieci), przy czym stage jest rodzic najwyższego poziomu.

Aby dodać coś do listy wyświetlania, użyj addChild lub addChildAt . Oto podstawowy przykład rysowania okręgu i dodawania go do listy wyświetlania:

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`

Aby zobaczyć obiekt w powyższym przykładzie, this (kontekst kodu) również musi znajdować się na liście wyświetlania, a także może mieć wszystkich rodziców. W AS3 stage jest najwyższym rodzajem.

Obiekty wyświetlane mogą mieć tylko jednego rodzica. Jeśli więc dziecko ma już rodzica i dodasz je do innego obiektu, zostanie ono usunięte z poprzedniego rodzica.

Z-zamówienie / nakładanie warstw

Załóżmy, że skopiowałeś kod z poprzedniego przykładu, więc masz 3 kręgi:

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); 

Ponieważ metoda addChild dodaje dziecko do wszystkiego innego w tym samym obiekcie nadrzędnym, otrzymasz ten wynik dzięki elementom ułożonym w tej samej kolejności, w jakiej używasz addChild:

wprowadź opis zdjęcia tutaj

Jeśli chcesz, aby dziecko różniło się warstwami w stosunku do rodzeństwa, możesz użyć addChildAt . Z addChildAt przekazujesz inny parametr wskazujący indeks (kolejność z), pod którym dziecko powinno się znajdować. 0 jest najniższą pozycją / warstwą.

this.addChild(redCircle); 
this.addChild(greenCircle); 
this.addChildAt(blueCircle,0); //This will add the blue circle at the bottom

wprowadź opis zdjęcia tutaj

Teraz niebieskie koło znajduje się pod rodzeństwem. Jeśli później chcesz zmienić indeks dziecka, możesz użyć metody setChildIndex (na rodzicu dziecka).

this.setChildIndex(redCircle, this.numChildren - 1); //since z-index is 0 based, the top most position is amount of children less 1.

Spowoduje to zmianę układu czerwonego koła, tak aby znajdowało się ponad wszystkim innym. Powyższy kod daje dokładnie taki sam wynik jak this.addChild(redCircle) .

Usuwanie obiektów wyświetlanych

Aby usunąć obiekty, musisz removeChildAt metod removeChild i removeChildAt , a także metody 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

Wydarzenia

Gdy dziecko jest dodawane do listy wyświetlania, niektóre zdarzenia są uruchamiane na tym dziecku.

  • Event.ADDED
  • Event.ADDED_TO_STAGE

I odwrotnie, istnieją również zdarzenia usuwania:

  • Event.REMOVED
  • Event.REMOVED_FROM_STAGE

Adobe Animate / Flash Professional

W przypadku osi czasu FlashProfessional / Adobe Animate dodanie czegoś do osi czasu automatycznie obsługuje niuanse listy wyświetlania. Dodali i usunęli z listy wyświetlania automatycznie według osi czasu.

Warto jednak pamiętać, że:

Jeśli manipulujesz za pomocą kodu pochodzenie obiektu wyświetlanego utworzonego przez oś czasu (za pomocą addChild / setChildIndex), to dziecko nie będzie już automatycznie usuwane przez oś czasu i będzie musiało zostać usunięte za pomocą kodu.

Nakładanie warstw

Mogą wystąpić sytuacje, w których zdecydujesz, że jeden zestaw obiektów wyświetlanych powinien zawsze znajdować się nad innym zestawem obiektów, na przykład strzały nad głowami, wybuchy nad czymś, co właśnie wybuchło itp. Aby wykonać to tak prosto, jak to możliwe, musisz wyznaczyć i utwórz zestaw Sprite , ułóż je w kolejności od dołu do góry, a następnie po prostu dodaj wszystkie obiekty zestawu „powyżej” do warstwy powyżej tej używanej dla obiektów zestawu „poniżej”.

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);

Następnie, ilekroć dodasz Monster do listy wyświetlania, dodaj go do monsterLayer , a za każdym razem, gdy dodasz Bullet , dodaj do bulletLayer aby osiągnąć pożądany efekt.

Usuń wszystkie obiekty z listy wyświetlania

W przypadku Flash Playera 11+ wbudowana metoda removeChildren jest najlepszym sposobem na usunięcie wszystkich dzieci:

removeChildren(); //a start and end index can be passed 

W przypadku starszych aplikacji to samo można osiągnąć za pomocą pętli:

while (numChildren > 0) {
    removeChildAt(0);
}

Przejście z ramek do ręcznego przełączania treści

Na początku programista Flash używa ramek, ponieważ są one natywnie dostępne we Flash Playerze, do obsługi różnych ekranów aplikacji (najczęściej jest to gra). W końcu mogą natknąć się na problem polegający na tym, że coś poszło nie tak dokładnie dlatego, że użyli ramek i przeoczyli wynikające z tego trudności, szukając sposobów na zachowanie struktury ramek, ale także na usunięcie przeszkody w korzystaniu z ramek z ich komplikacjami. Rozwiązaniem jest użycie klas potomnych Sprite lub eksportowanych klatek jako MovieClip z pojedynczą klatką (do tych, które projektują w Adobe Flash CS), a także ręczne przełączanie zawartości za pomocą addChild() i removeChild() .

Klasa menedżera powinna mieć przygotowane wszystkie swoje potomne klasy ramek i za każdym razem, gdy wywoływane jest przejście, można użyć funkcji podobnej do tej:

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;
}

Wszystkie dzieci mogą zarówno wysyłać, jak i słuchać zdarzeń za pomocą Event.ADDED_TO_STAGE używanego jako punkt wejścia do wszystkiego, co dzieje się po gotoAndStop() tę ramkę, a wszelkie wychodzące przejścia mogą być kodowane jako zdarzenia na podstawie ciągów, które są słuchane w klasie Main , który następnie wykonuje przejście.

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]
}

Oczywiście zestaw ciągów powinien być wstępnie zdefiniowany, na przykład ekran wprowadzający może mieć dwa przyciski, aby rozpocząć grę, na przykład „Rozpocznij grę” i „Rozpocznij wyciszenie”, a przyciski powinny wywoływać różne zdarzenia, które zostaną następnie obsłużone inaczej w klasie menedżerskiej.

Ten wzór może sięgać tak głęboko, jak potrzebujesz. Jeśli jakakolwiek klatka projektu zawiera klip filmowy z wieloma klatkami, można ją również odłączyć do duszków za pomocą tej metody.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow