ActionScript 3
Lavorare con gli oggetti di visualizzazione
Ricerca…
Sintassi
-
addChild(child)
- aggiunge un nuovo elemento all'albero figlio di questo oggetto come elemento più in alto. -
addChildAt(child, index)
- aggiunge un nuovo elemento all'albero figlio di questo oggetto in una posizione specificata. L'elemento in basso ha indice 0. -
getChildAt(index)
- restituisce un child con un determinato indice. -
getChildIndex(child)
restituisce l'indice di un figlio diretto di questo oggetto. Altrimenti viene generata un'eccezione. -
removeChild(child)
- rimuove il figlio diretto specificato dall'albero figlio di questo oggetto. Genera un'eccezione se il genitore del figlio fornito non è uguale athis
. -
removeChildAt(index)
- rimuove un figlio selezionato per indice invece di riferimento. Genera un'eccezione se l'albero figlio non è così largo. -
removeChildren(beginIndex:int = 0, endIndex:int = 0x7fffffff))
: aggiunto in Flash Player 11, rimuove un sottoinsieme di elementiremoveChildren(beginIndex:int = 0, endIndex:int = 0x7fffffff))
per intervallo di indice o tutti i child se viene chiamato senza parametri. -
setChildIndex(child,index)
- cambia l'indice del bambino nel nuovo valore, spostando tutti i bambini in mezzo per occupare il punto rilasciato. -
swapChildren(child1,child2)
- scambia le posizioni dei due bambini nell'elenco di visualizzazione, senza influenzare le posizioni di altri bambini. -
swapChildrenAt(index1,index2)
- scambia i bambini che si trovano nei loro indici.
Osservazioni
L'elenco di visualizzazione è in realtà un albero e viene visualizzato con il primo algoritmo di profondità. Qualsiasi oggetto elencato in precedenza verrà visualizzato in precedenza e potrebbe essere oscurato da oggetti elencati in seguito. Tutte le tecniche che possono essere utilizzate contro un albero possono essere applicate a lavorare con l'elenco di visualizzazione.
Introduzione alla lista di visualizzazione
In AS3, le risorse di visualizzazione non sono visibili finché non vengono aggiunte all'elenco di visualizzazione.
Il runtime AIR / Flash ha una struttura di visualizzazione gerarchica (relazione figlio genitore in cui i bambini possono avere figli propri), con lo stage
come genitore di livello superiore.
Per aggiungere qualcosa all'elenco di visualizzazione, si usi addChild
o addChildAt
. Ecco un esempio di base per disegnare un cerchio e aggiungerlo all'elenco di visualizzazione:
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`
Per vedere l'oggetto nell'esempio sopra, anche this
(il contesto del codice) deve essere presente nell'elenco di visualizzazione, così come i genitori che potrebbe avere. In AS3, il stage
è il più alto dei genitori.
Gli oggetti di visualizzazione possono avere solo un genitore. Quindi, se un bambino ha già un genitore e lo aggiungi a un altro oggetto, verrà rimosso dal precedente genitore.
Ordine Z / Stratificazione
Supponiamo che tu abbia replicato il codice dell'esempio precedente in modo da avere 3 cerchi:
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);
Dato che il metodo addChild
aggiunge il figlio sopra a tutto il resto nello stesso genitore, otterrai questo risultato con gli oggetti a strati nello stesso ordine in cui usi addChild:
Se vuoi che un bambino abbia livelli diversi rispetto ai suoi fratelli, puoi usare addChildAt
. Con addChildAt
, si passa in un altro parametro che indica l'indice (ordine z) a cui dovrebbe essere assegnato il figlio. 0
è la posizione / livello più in basso.
this.addChild(redCircle);
this.addChild(greenCircle);
this.addChildAt(blueCircle,0); //This will add the blue circle at the bottom
Ora il cerchio blu è sotto i suoi fratelli. Se in seguito, si desidera modificare l'indice di un figlio, è possibile utilizzare il metodo setChildIndex
(sul genitore del figlio).
this.setChildIndex(redCircle, this.numChildren - 1); //since z-index is 0 based, the top most position is amount of children less 1.
Questo riorganizzerà il cerchio rosso in modo che sia sopra ogni altra cosa. Il codice sopra produce lo stesso risultato di this.addChild(redCircle)
.
Rimozione di oggetti di visualizzazione
Per rimuovere oggetti, hai i metodi removeChildAt
removeChild
e removeChildAt
, nonché il metodo 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
eventi
Quando un bambino viene aggiunto all'elenco di visualizzazione, alcuni eventi vengono attivati su quel bambino.
-
Event.ADDED
-
Event.ADDED_TO_STAGE
Al contrario, ci sono anche gli eventi di rimozione:
-
Event.REMOVED
-
Event.REMOVED_FROM_STAGE
Adobe Animate / Flash Professional
Quando si ha a che fare con le timeline FlashProfessional / Adobe Animate, l'aggiunta di qualcosa alla timeline gestisce automaticamente le sfumature dell'elenco di visualizzazione. Hanno aggiunto e rimosso dalla lista di visualizzazione automaticamente dalla timeline.
Tuttavia, è bene tenere presente che:
Se si manipola tramite codice la parentela di un oggetto di visualizzazione creato dalla timeline (utilizzando addChild / setChildIndex), tale figlio non verrà più rimosso automaticamente dalla timeline e dovrà essere rimosso tramite codice.
stratificazione
Ci possono essere situazioni in cui si decide che un set di oggetti di visualizzazione deve sempre trovarsi sopra un altro set di oggetti, ad esempio frecce sopra la testa, esplosioni su qualcosa appena esploso, ecc. Per eseguire questa operazione il più semplice possibile, è necessario designare e crea un set di Sprite
, disponili in ordine dal basso verso l'alto, quindi aggiungi tutti gli oggetti di "sopra" impostati su un livello superiore a quello usato per gli oggetti di "sotto".
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);
Quindi, ogni volta che aggiungi un Monster
all'elenco di visualizzazione, aggiungilo a monsterLayer
e ogni volta che aggiungi un Bullet
, aggiungi a bulletLayer
per ottenere l'effetto desiderato.
Rimuovi tutti gli oggetti dall'elenco di visualizzazione
Se scegli come target Flash Player 11+, il metodo removeChildren incorporato è il modo migliore per rimuovere tutti i bambini:
removeChildren(); //a start and end index can be passed
Per le applicazioni legacy, lo stesso può essere realizzato con un ciclo:
while (numChildren > 0) {
removeChildAt(0);
}
Passaggio da frame a commutazione del contenuto manuale
All'inizio, uno sviluppatore di Flash utilizza i frame, come sono nativamente disponibili in Flash Player, per ospitare vari schermi della loro applicazione (il più delle volte è un gioco). Alla fine potrebbero incappare in un problema che qualcosa va storto proprio perché hanno usato i frame, e trascurato le difficoltà che ne derivano, e cercano modi per mantenere la loro struttura di frame, ma anche rimuovere l'ostacolo dell'utilizzo di frame con le sue complicazioni. La soluzione consiste nell'utilizzare le classi discendenti di Sprite
o i fotogrammi esportati come MovieClip
con un singolo fotogramma (con quelli progettati in Adobe Flash CS) e passare manualmente i contenuti con addChild()
e removeChild()
.
La classe manager dovrebbe avere tutte le sue classi frame figlio pronte e ogni volta che viene chiamata una transizione, è possibile utilizzare una funzione simile a questa:
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;
}
Tutti i bambini possono sia inviare che ascoltare eventi con Event.ADDED_TO_STAGE
utilizzato come punto di ingresso per qualsiasi cosa accada dopo gotoAndStop()
che punta a tale frame e qualsiasi transizione in uscita può essere codificata come eventi basati su stringhe che vengono ascoltate nella classe Main
, che poi esegue la transizione.
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]
}
Ovviamente, l'insieme di stringhe dovrebbe essere predefinito, ad esempio, lo schermo introduttivo potrebbe avere due pulsanti per iniziare il gioco, "Inizia partita" e "Inizio disattivato", ad esempio, ei pulsanti dovrebbero inviare diversi eventi, che verranno quindi gestiti diversamente nella classe manager.
Questo modello può andare più in profondità di cui hai bisogno. Se qualsiasi frame del progetto contiene un MovieClip con più frame, questo metodo può anche essere disaccoppiato in sprite.