Zoeken…


Syntaxis

  1. addChild(child) - voegt een nieuw item toe aan de child tree van dit object als het bovenste element.
  2. addChildAt(child, index) - voegt een nieuw item toe aan de child tree van dit object op een gespecificeerde positie. Het onderste item heeft een index van 0.
  3. getChildAt(index) - geeft een kind terug met de gegeven index.
  4. getChildIndex(child) retourneert de index van een direct child van dit object. Anders wordt een uitzondering gemaakt.
  5. removeChild(child) - verwijdert het opgegeven directe child uit de child tree van dit object. Gooit uitzondering als ouder de meegeleverde kind is niet gelijk aan this .
  6. removeChildAt(index) - verwijdert een kind geselecteerd door index in plaats van referentie. Gooit uitzondering als de onderliggende boom niet zo breed is.
  7. removeChildren(beginIndex:int = 0, endIndex:int = 0x7fffffff)) - toegevoegd in Flash Player 11, verwijdert een subset van kinderen op indexbereik, of alle kinderen indien opgeroepen zonder parameters.
  8. setChildIndex(child,index) - wijzigt de index van het kind in de nieuwe waarde, waarbij alle kinderen tussendoor worden verschoven om de vrijgegeven plek te bezetten.
  9. swapChildren(child1,child2) - verwisselt de posities van de twee kinderen in het display, dit heeft geen invloed op de posities van andere kinderen.
  10. swapChildrenAt(index1,index2) - verwisselt kinderen op basis van hun indexen.

Opmerkingen

De weergavelijst is eigenlijk een boom en wordt gevisualiseerd met het eerste diepte-algoritme. Elk eerder vermeld object wordt eerder weergegeven en kan worden verborgen door objecten die later worden vermeld. Alle technieken die tegen een boom kunnen worden gebruikt, kunnen worden toegepast op het werken met displaylijst.

Inleiding tot de weergavelijst

In AS3 zijn weergaveactiva niet zichtbaar totdat ze aan de weergavelijst zijn toegevoegd.

De AIR / Flash-runtime heeft een hiërarchische weergavestructuur (ouder-kindrelatie waarbij kinderen hun eigen kinderen kunnen hebben), waarbij het stage de bovenliggende ouder is.

Om iets toe te voegen aan het weergaveoverzicht, gebruikt u addChild of addChildAt . Hier is een eenvoudig voorbeeld van het tekenen van een cirkel en deze toe te voegen aan het weergaveoverzicht:

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`

Om het object in het bovenstaande voorbeeld te zien, moet this (de context van de code) ook op de displaylijst staan, evenals eventuele ouders die het heeft. In AS3 is de stage de hoogste ouder.

Weergaveobjecten kunnen slechts één ouder hebben. Dus als een kind al een ouder heeft en u voegt dit toe aan een ander object, wordt het verwijderd uit de vorige ouder.

Z-volgorde / gelaagdheid

Stel dat u de code uit het vorige voorbeeld hebt gerepliceerd, zodat u 3 cirkels had:

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

Omdat de addChild het kind bovenop al het andere in hetzelfde bovenliggende addChild toevoegt, krijg je dit resultaat met de items gelaagd in dezelfde volgorde als waarin je addChild gebruikt:

voer hier de afbeeldingsbeschrijving in

Als u een ander gelaagd kind ten opzichte van zijn broers en zussen wilt, kunt u addChildAt . Met addChildAt geeft u een andere parameter door die de index (z-volgorde) aangeeft waarop het kind zich moet bevinden. 0 is de onderste positie / laag.

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

voer hier de afbeeldingsbeschrijving in

Nu is de blauwe cirkel onder zijn broers en zussen. Als u later de index van een kind wilt wijzigen, kunt u de methode setChildIndex gebruiken (op de ouder van het kind).

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

Dit zal de rode cirkel herschikken, zodat deze boven al het andere staat. De bovenstaande code geeft exact hetzelfde resultaat als this.addChild(redCircle) .

Weergaveobjecten verwijderen

Om objecten te verwijderen, hebt u de omgekeerde methoden removeChild en removeChildAt , evenals de methode 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

Evenementen

Wanneer een kind aan het weergaveoverzicht wordt toegevoegd, worden sommige gebeurtenissen op dat kind geactiveerd.

  • Event.ADDED
  • Event.ADDED_TO_STAGE

Omgekeerd zijn er ook de verwijdergebeurtenissen:

  • Event.REMOVED
  • Event.REMOVED_FROM_STAGE

Adobe Animate / Flash Professional

Bij het omgaan met FlashProfessional / Adobe Animate-tijdlijnen worden de nuances van de weergavelijst automatisch verwerkt door iets aan de tijdlijn toe te voegen. Ze hebben deze automatisch toegevoegd en verwijderd uit de lijst met de tijdlijn.

Het is echter goed om te onthouden dat:

Als u door middel van code het ouderschap van een weergaveobject dat door de tijdlijn is gemaakt, manipuleert (met addChild / setChildIndex), wordt dat kind niet langer automatisch verwijderd door de tijdlijn en moet het via code worden verwijderd.

gelaagdheid

Er kunnen situaties zijn waarin u besluit dat een set weergaveobjecten altijd boven een andere set objecten moet staan, bijvoorbeeld pijlen boven hoofden, explosies over iets dat zojuist is ontploft, enz. Om dit zo eenvoudig mogelijk uit te voeren, moet u aangeven en maak een set Sprite s, rangschik ze in volgorde van onder naar boven en voeg dan gewoon alle objecten van "boven" set toe aan een laag boven de laag die wordt gebruikt voor objecten van "onder" set.

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

Telkens wanneer u een Monster toevoegt aan de weergavelijst, voegt u het toe aan monsterLayer en telkens wanneer u een Bullet toevoegt, voegt u toe aan bulletLayer om het gewenste effect te bereiken.

Verwijder alle objecten uit het weergaveoverzicht

Als u zich richt op Flash Player 11+, is de ingebouwde methode removeChildren de beste manier om alle kinderen te verwijderen:

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

Voor oudere toepassingen kan hetzelfde worden bereikt met een lus:

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

Overgaan van frames naar handmatig schakelen tussen inhoud

In een vroeg stadium gebruikt een Flash-ontwikkelaar frames, omdat deze native beschikbaar zijn in Flash Player, om verschillende schermen van hun applicatie te hosten (meestal is het een spel). Uiteindelijk kunnen ze stuiten op een probleem dat er iets misgaat, precies omdat ze frames hebben gebruikt en de moeilijkheden die hieruit voortvloeien, over het hoofd hebben gezien, en manieren zoeken om zowel hun framestructuur te behouden als het obstakel te verwijderen om frames met de complicaties ervan te gebruiken. De oplossing is om Sprite afstammingsklassen te gebruiken of geëxporteerde frames als MovieClip s met een enkel frame (naar degenen die ontwerpen in Adobe Flash CS) en de inhoud handmatig te schakelen met addChild() en removeChild() .

De beheerklasse moet alle onderliggende frameklassen gereed hebben en wanneer een overgang wordt aangeroepen, kan een soortgelijke functie worden gebruikt:

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

Alle kinderen kunnen gebeurtenissen verzenden en ernaar luisteren met Event.ADDED_TO_STAGE als Event.ADDED_TO_STAGE voor wat er ook gebeurt nadat gotoAndStop() dat frame is gericht, en alle uitgaande overgangen kunnen worden gecodeerd als gebeurtenissen op basis van tekenreeksen, die worden beluisterd in Main hoofdklasse, die vervolgens de overgang uitvoert.

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

Natuurlijk moet de reeks tekenreeksen vooraf worden gedefinieerd, het introductiescherm kan bijvoorbeeld twee knoppen hebben om het spel te starten, "Start game" en "Start mute" bijvoorbeeld, en de knoppen moeten verschillende gebeurtenissen verzenden, die vervolgens worden afgehandeld anders in de managerklasse.

Dit patroon kan zo diep gaan als nodig is. Als een frame van een project een MovieClip met meerdere frames bevat, kan het met deze methode ook worden losgekoppeld in sprites.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow