Con la riscrittura di ActionScript c'è stato un sostanziale cambiamento sul come ActionScript interagisce con la timeline e con la navigazione a frame. Un esempio specifico riguarda la navigazione verso un nuovo frame con un movie clip interno a questo frame.
In as2 sarebbe stato sufficente scrivere qualcosa come:
target.gotoAndStop(10);
target.child._rotation = 90;
Dove il figlio del movie clip è un movie clip annidato nel frame 10 del target. Usando target.child._rotation = 90; il movie clip si sarebbe ruotato senza problemi.
Questo non è più possibile in ActionScript 3.
Non così facilmente quantomeno: gli oggetti figli non sono istanziati fino a quando il frame in cui sono annidati non viene richiamato. Questo previene un inutile lavoro e carico da parte della cpu di istanziamenti di oggetti nel caso non si vada mai su quel determinato frame. Il lato negativo di ciò è che non si potrà accedere direttamente al figlio come si faceva in precedenza.
Il seguente è l'ordine di esecuzione all'interno del frame in discussione:
- Event.ENTER_FRAME;
- Script dei genitori del clip;
- esecuzione dello script del frame in questione;
- Istanziamento dei figli;
- Event.ADDED per ogni figlio istanziato;
- Assegnazione della proprietà "name" ai figli;
- Event.RENDER event (richiede il richiamo a stage.invalidate());
- Flash disegna sullo schermo il suo output;
Si capisce che il modo per avere acesso ai figli dello sconsolato frame numero 10 dello script in questione è utilizzare gli eventi ADDED e/o RENDER.
Event.ADDED
target.addEventListener(Event.ADDED, onAdded);
function onAdded(event:Event):void {
// get reference to child from event object
// as child variable of target will not yet be defined
var childRef:MovieClip = event.target as MovieClip;
// check the name of the reference for correct instance name
if (childRef && childRef.name == "child"){
childRef.rotation = 90;
target.removeEventListener(Event.ADDED, onAdded);
}
}
target.gotoAndStop(10);
Event.RENDER
target.addEventListener(Event.RENDER, onRender);
function onRender(event:Event):void {
// by the time the RENDER event fires, the child
// clip will be completely defined and accessible
target.child.rotation = 90;
}
stage.invalidate();
target.gotoAndStop(2);
A causa di queste complicazioni è sconsigliato accedere in questo modo agli oggetti e progettare il tutto in maniera da impedire situazioni di questo tipo.
L'articolo è una opera di libera traduzione taglio e pasticcio del seguente articolo di Kirupa: Flash CS3: Frame Navigation and Child Access.