ActionScript 3
Arbeta med skärmobjekt
Sök…
Syntax
-
addChild(child)
- lägger till ett nytt objekt i objektets barnträd som det översta elementet. -
addChildAt(child, index)
- lägger till ett nytt objekt till objektets underträd på en specificerad position. Det nedersta objektet har index 0. -
getChildAt(index)
- returnerar ett barn med givet index. -
getChildIndex(child)
returnerar indexet för ett direkt barn för detta objekt. Annars kastas ett undantag. -
removeChild(child)
- tar bort det angivna direkta barnet från objektets barnträd. Kasta undantag om det levererade barnets förälder inte är lika medthis
. -
removeChildAt(index)
- tar bort ett barn som har valts efter index istället för referens. Kasta undantag om barnet trädet inte är så brett. -
removeChildren(beginIndex:int = 0, endIndex:int = 0x7fffffff))
- läggs till i Flash Player 11, tar bort en delmängd av barn efter indexområde, eller alla barn om de inte har några parametrar. -
setChildIndex(child,index)
- ändrar barnets index till det nya värdet och flyttar alla barn emellan för att ockupera den frigjorda platsen. -
swapChildren(child1,child2)
- byter de två barnens positioner i displaylistan, påverkar inte andra barns positioner. -
swapChildrenAt(index1,index2)
- byter barn som ligger efter deras index.
Anmärkningar
Displaylistan är faktiskt ett träd och visualiseras med en första djupalgoritm. Alla objekt som listats tidigare kommer att visas tidigare och kan skymmas av objekt som listas senare. Alla tekniker som kan användas mot ett träd kan användas för att arbeta med displaylista.
Introduktion till visningslistan
I AS3 är visningstillgångar inte synliga förrän de läggs till i Display List.
AIR / Flash-körtiden har en hierarkisk visningsstruktur (förälderbarnsförhållande där barn kan ha sina egna barn), där stage
är den högsta föräldern.
För att lägga till något i addChild
använder du addChild
eller addChildAt
. Här är ett grundläggande exempel på att rita en cirkel och lägga till den i displaylistan:
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`
För att se objektet i exemplet ovan måste this
(koden) också finnas i displaylistan, liksom alla föräldrar det kan ha. I AS3 är stage
den högsta föräldern.
Visa objekt kan bara ha en förälder. Så om ett barn redan har en förälder, och du lägger till det till ett annat objekt, kommer det att tas bort från dess föregående förälder.
Z-ordning / lager
Låt oss säga att du replikerade koden från föregående exempel så att du hade tre cirklar:
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);
Eftersom metoden addChild
lägger till barnet ovanför allt annat i samma förälder, får du detta resultat med objekten i lager i samma ordning som du använder addChild:
Om du ville ha ett barn med olika skikt i förhållande till sina syskon kan du använda addChildAt
. Med addChildAt
du in en annan parameter som indikerar index (z-ordning) som barnet ska vara på. 0
är det lägsta läget / lagret.
this.addChild(redCircle);
this.addChild(greenCircle);
this.addChildAt(blueCircle,0); //This will add the blue circle at the bottom
Nu är den blå cirkeln under sina syskon. Om du senare vill ändra ett barns index kan du använda metoden setChildIndex
(på barnets förälder).
this.setChildIndex(redCircle, this.numChildren - 1); //since z-index is 0 based, the top most position is amount of children less 1.
Detta kommer att ordna om den röda cirkeln så att den är över allt annat. Koden ovan ger exakt samma resultat som this.addChild(redCircle)
.
Ta bort visningsobjekt
För att ta bort objekt har du konversationen removeChild
och removeChildAt
metoder samt metoden 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
evenemang
När ett barn läggs till i listan visas några händelser på det barnet.
-
Event.ADDED
-
Event.ADDED_TO_STAGE
Omvänt finns det också händelserna som tas bort:
-
Event.REMOVED
-
Event.REMOVED_FROM_STAGE
Adobe Animate / Flash Professional
När du hanterar FlashProfessional / Adobe Animate-tidslinjer, läggs något till tidslinjen automatiskt till nyanserna i visningslistan. De läggs till och tas bort från visningslistan automatiskt med tidslinjen.
Det är dock bra att komma ihåg att:
Om du manipulerar genom koden föräldrarna för ett visningsobjekt som skapats av tidslinjen (med hjälp av addChild / setChildIndex) kommer det barnet inte längre att tas bort automatiskt av tidslinjen och måste tas bort via kod.
skiktning
Det kan finnas situationer när du bestämmer dig för att en uppsättning visningsobjekt alltid ska ligga ovanför en annan uppsättning objekt, till exempel pilar över huvuden, explosioner över något som just exploderade, etc. För att utföra detta så enkelt som möjligt måste du ange och skapa en uppsättning av Sprite
s, ordna dem i ordning från botten till topp, lägg bara till alla objekt av "ovan" uppsättning i ett lager ovanför det som används för objekt i "nedan" 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);
Sedan lägger du till ett Monster
i displaylistan lägger du till det i monsterLayer
, och när du lägger till en Bullet
, lägg till bulletLayer
att uppnå önskad effekt.
Ta bort alla objekt från displaylistan
Om du inriktar dig på Flash Player 11+ är den inbyggda removeChildren- metoden det bästa sättet att ta bort alla barn:
removeChildren(); //a start and end index can be passed
För gamla applikationer kan samma utföras med en slinga:
while (numChildren > 0) {
removeChildAt(0);
}
Övergång från ramar till manuell innehållsväxling
Tidigt använder en Flash-utvecklare ramar, eftersom de finns tillgängliga i Flash-spelare, för att vara värd för olika skärmar i deras applikation (oftast är det ett spel). Så småningom kan de snubbla på en fråga om att något går fel exakt för att de har använt ramar, och förbisett svårigheterna som uppstår härifrån, och söker sätt att både behålla sin ramstruktur men också ta bort hindret för att använda ramar med dess komplikationer. Lösningen är att använda Sprite
efterkommandeklasser, eller exporterade ramar som MovieClip
med en enda ram (till de som designar i Adobe Flash CS), och manuellt växla innehållet med addChild()
och removeChild()
.
Managerklassen ska ha alla sina barnramsklasser redo, och när en övergång anropas kan en funktion liknande den användas:
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;
}
Alla barn kan både sändning och lyssna på händelser med Event.ADDED_TO_STAGE
används som en startpunkt för vad som än händer efter gotoAndStop()
målsökande denna ram, och alla utgående övergångar kan kodas som händelser som baseras på strängar, som lyssnar i Main
som sedan utför övergången.
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]
}
Naturligtvis bör uppsättningen av strängar fördefinieras, till exempel kan intro skärmen ha två knappar för att starta spelet, "Starta spelet" och "Start dämpat" till exempel, och knapparna ska skicka olika händelser, som sedan hanteras annorlunda i chefsklassen.
Detta mönster kan gå så djupt som du behöver. Om någon ram i projektet innehåller en MovieClip med flera ramar, kan den också kopplas från till spriter med den här metoden.