ActionScript 3
Mit Anzeigeobjekten arbeiten
Suche…
Syntax
-
addChild(child)
- fügt deraddChild(child)
Baumstruktur dieses Objekts ein neues Element als oberstes Element hinzu. -
addChildAt(child, index)
- fügt deraddChildAt(child, index)
Baumstruktur dieses Objekts an einer angegebenen Position ein neues Element hinzu. Das unterste Element hat den Index 0. -
getChildAt(index)
- gibt ein Kind mit dem angegebenen Index zurück. -
getChildIndex(child)
gibt den Index eines direktengetChildIndex(child)
Objekts dieses Objekts zurück. Ansonsten wird eine Ausnahme ausgelöst. -
removeChild(child)
-removeChild(child)
das angegebene direkteremoveChild(child)
Objekt aus demremoveChild(child)
Baum dieses Objekts. Löst eine Ausnahme aus, wenn das übergeordnete Elternteil nichtthis
. -
removeChildAt(index)
-removeChildAt(index)
ein durch den Index ausgewähltesremoveChildAt(index)
anstelle der Referenz. Löst eine Ausnahme aus, wenn der untergeordnete Baum nicht so breit ist. -
removeChildren(beginIndex:int = 0, endIndex:int = 0x7fffffff))
- in Flash Player 11 hinzugefügt, entfernt eine Untermenge vonremoveChildren(beginIndex:int = 0, endIndex:int = 0x7fffffff))
nach Indexbereich oder alleremoveChildren(beginIndex:int = 0, endIndex:int = 0x7fffffff))
, wenn sie ohne Parameter aufgerufen werden. -
setChildIndex(child,index)
- ändert den Index dessetChildIndex(child,index)
auf den neuen Wert, wobei allesetChildIndex(child,index)
verschoben werden, um den freigegebenen Bereich zu belegen. -
swapChildren(child1,child2)
- tauscht die Positionen der beiden Kinder in der Anzeigeliste, ohne die Positionen anderer Kinder zu beeinflussen. -
swapChildrenAt(index1,index2)
- tauschtswapChildrenAt(index1,index2)
Kinder anhand ihrer Indizes aus.
Bemerkungen
Die Anzeigeliste ist eigentlich ein Baum und wird mit dem Tiefenalgorithmus visualisiert. Alle zuvor aufgelisteten Objekte werden früher angezeigt und können durch später aufgeführte Objekte verdeckt werden. Alle Techniken, die für einen Baum verwendet werden können, können auf das Arbeiten mit der Anzeigeliste angewendet werden.
Einführung in die Anzeigeliste
In AS3 sind Anzeigeelemente erst sichtbar, wenn sie der Anzeigeliste hinzugefügt werden.
Die AIR- / Flash-Laufzeitumgebung verfügt über eine hierarchische Anzeigestruktur (Eltern-Kind-Beziehung, in der Kinder eigene Kinder haben können), wobei die stage
das übergeordnete Element der obersten Ebene ist.
Um der Anzeigeliste etwas hinzuzufügen, verwenden Sie addChild
oder addChildAt
. Hier ein grundlegendes Beispiel für das Zeichnen eines Kreises und das Hinzufügen zu der Anzeigeliste:
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`
Um das Objekt im obigen Beispiel zu sehen, muss sich this
(der Kontext des Codes) auch auf der Anzeigeliste befinden, ebenso wie alle übergeordneten Elemente. In AS3 ist die stage
die oberste Mutter.
Anzeigeobjekte können nur ein übergeordnetes Element haben. Wenn ein Kind bereits über ein Elternteil verfügt und Sie es einem anderen Objekt hinzufügen, wird es aus dem vorherigen übergeordneten Objekt entfernt.
Z-Reihenfolge / Schichtung
Angenommen, Sie haben den Code aus dem vorherigen Beispiel repliziert, so dass Sie 3 Kreise hatten:
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);
Da die addChild
Methode das Kind zusätzlich zu addChild
anderen Elementen in demselben übergeordneten addChild
hinzufügt, erhalten Sie dieses Ergebnis, wenn die Elemente in derselben Reihenfolge angeordnet sind, in der Sie addChild verwenden:
Wenn Sie addChildAt
dass ein Kind relativ zu seinen Geschwistern unterschiedlich angeordnet ist, können Sie addChildAt
. Mit addChildAt
Sie einen weiteren Parameter, der den Index (Z-Reihenfolge) angibt, in dem sich das Kind befinden soll. 0
ist die unterste Position / Ebene.
this.addChild(redCircle);
this.addChild(greenCircle);
this.addChildAt(blueCircle,0); //This will add the blue circle at the bottom
Nun ist der blaue Kreis unter seinen Geschwistern. Wenn Sie später den Index eines setChildIndex
ändern möchten, können Sie die setChildIndex
Methode (für das übergeordnete setChildIndex
) verwenden.
this.setChildIndex(redCircle, this.numChildren - 1); //since z-index is 0 based, the top most position is amount of children less 1.
Dadurch wird der rote Kreis neu angeordnet, so dass er über allem anderen steht. Der obige Code liefert das gleiche Ergebnis wie this.addChild(redCircle)
.
Anzeigeobjekte entfernen
Um Objekte zu entfernen, verfügen Sie über die umgekehrten removeChild
und removeChildAt
Methoden sowie über die removeChildren
Methode.
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
Veranstaltungen
Wenn ein Kind der Anzeigeliste hinzugefügt wird, werden einige Ereignisse für dieses Kind ausgelöst.
-
Event.ADDED
-
Event.ADDED_TO_STAGE
Umgekehrt gibt es auch die Remove-Events:
-
Event.REMOVED
-
Event.REMOVED_FROM_STAGE
Adobe Animate / Flash Professional
Wenn Sie FlashProfessional / Adobe Animate-Zeitleisten verwenden, werden durch das Hinzufügen von Elementen zur Zeitleiste die Nuancen der Anzeigeliste automatisch behandelt. Sie wurden automatisch von der Timeline hinzugefügt und aus der Anzeigeliste entfernt.
Es ist jedoch gut zu wissen, dass:
Wenn Sie die Abstammung eines durch die Zeitleiste erstellten Anzeigeobjekts (mithilfe von addChild / setChildIndex) durch Code bearbeiten, wird dieses untergeordnete Element nicht mehr automatisch von der Zeitleiste entfernt und muss über Code entfernt werden.
Schichtung
Es kann Situationen geben, in denen Sie entscheiden, dass sich ein Satz von Anzeigeobjekten immer über einem anderen Satz von Objekten befinden sollte, z. B. Pfeile über Kopf, Explosionen über etwas, das gerade explodiert ist usw. Um dies so einfach wie möglich zu machen, müssen Sie es festlegen und erstellen Sie eine Gruppe von Sprite
, ordnen Sie sie in der Reihenfolge von unten nach oben an und fügen Sie dann alle Objekte der Gruppe "oben" einer Ebene hinzu, die über der Ebene für Objekte der Gruppe "unterhalb" liegt.
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);
Wenn Sie ein Monster
zur Anzeigeliste hinzufügen, fügen Sie es zu monsterLayer
. Wenn Sie ein Bullet
hinzufügen, fügen Sie es zu bulletLayer
, um den gewünschten Effekt zu erzielen.
Entfernen Sie alle Objekte aus der Anzeigeliste
Wenn Sie Flash Player 11+ als Ziel verwenden, können Sie mit der integrierten removeChildren- Methode alle untergeordneten Elemente entfernen:
removeChildren(); //a start and end index can be passed
Für ältere Anwendungen kann dasselbe mit einer Schleife erreicht werden:
while (numChildren > 0) {
removeChildAt(0);
}
Übergang von Frames zu manueller Inhaltsumschaltung
Ein Flash-Entwickler verwendet Frames, da sie in Flash Player nativ verfügbar sind, um verschiedene Bildschirme ihrer Anwendung zu hosten (meistens handelt es sich dabei um ein Spiel). Möglicherweise stolpern sie über ein Problem, dass etwas nicht funktioniert, weil sie Frames verwendet haben und die daraus resultierenden Schwierigkeiten übersehen haben. Sie suchen nach Wegen, sowohl ihre Frame-Struktur beizubehalten als auch das Hindernis für die Verwendung von Frames mit ihren Komplikationen zu beseitigen. Die Lösung besteht darin, Sprite
Nachkommenklassen zu verwenden oder Frames als MovieClip
mit einem einzigen Frame (für diejenigen, die in Adobe Flash CS entworfen wurden) zu exportieren und den Inhalt manuell mit addChild()
und removeChild()
wechseln.
Die Manager-Klasse sollte alle untergeordneten Frame-Klassen bereithalten. Wenn ein Übergang aufgerufen wird, kann eine ähnliche Funktion verwendet werden:
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 Kinder können Ereignisse mit Event.ADDED_TO_STAGE
das als Einstiegspunkt für alles dient, nachdem gotoAndStop()
diesen Frame anvisiert hat, auslösen und abhören. Alle ausgehenden Übergänge können als Ereignisse basierend auf Zeichenfolgen codiert werden, die in der Main
Klasse abgehört werden das führt dann den Übergang durch.
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]
}
Natürlich sollte der Satz von Saiten vordefiniert sein. Zum Beispiel könnte der Intro-Bildschirm zwei Schaltflächen zum Starten des Spiels haben, beispielsweise "Spiel starten" und "Start stummgeschaltet". Die Schaltflächen sollten unterschiedliche Ereignisse auslösen, die dann behandelt werden anders in der Managerklasse.
Dieses Muster kann so tief gehen, wie Sie es brauchen. Wenn ein Frame des Projekts einen MovieClip mit mehreren Frames enthält, kann er mit dieser Methode auch in Sprites entkoppelt werden.