ActionScript 3
Werken met weergaveobjecten
Zoeken…
Syntaxis
-
addChild(child)
- voegt een nieuw item toe aan de child tree van dit object als het bovenste element. -
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. -
getChildAt(index)
- geeft een kind terug met de gegeven index. -
getChildIndex(child)
retourneert de index van een direct child van dit object. Anders wordt een uitzondering gemaakt. -
removeChild(child)
- verwijdert het opgegeven directe child uit de child tree van dit object. Gooit uitzondering als ouder de meegeleverde kind is niet gelijk aanthis
. -
removeChildAt(index)
- verwijdert een kind geselecteerd door index in plaats van referentie. Gooit uitzondering als de onderliggende boom niet zo breed is. -
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. -
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. -
swapChildren(child1,child2)
- verwisselt de posities van de twee kinderen in het display, dit heeft geen invloed op de posities van andere kinderen. -
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:
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
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.