Eccoci ad un altro trucco ( che poi non è un trucco ma credo sia pura essenza della OOP ) che può aiutarci non poco durante lo sviluppo di applicazioni Flash CS3.
Si tratta dell' evento Event.ADDED_TO_STAGE.
Serve fare un esempio per poter arrivare allo scopo preciso di questo tutorial.
Supponiamo di avere una MovieClip sullo stage che chiamiamo ' container_mc 'ed un' altra ' quadrato_mc '.
Vogliamo attaccare un' altra MovieClip che abbiamo in libreria ( associata ad una classe di nome Clip ) all' interno di container_mc e fin quì tutto ok, abbiamo visto più volte come fare: vedi questo articolo.
Bene, la domanda che vi pongo ora è la seguente:
- dobbiamo creare noi la classe associata alla MovieClip che vogliamo attaccare oppure la lasciamo creare a Flash ?
Personalmente, credo che bisognerebbe crearla sempre.
Prima di tutto perchè in questo modo non dobbiamo scrivere codice all' interno della MovieClip ma lo scriviamo nella classe in modo da avere un controllo totale e senza inciampare in sgradevoli errori che molti di voi stanno incontrando scrivendo codice dentro alle MovieClip.
Il secondo perchè è dovuto al fatto che possiamo mantenere tutto l' albero gerarchico della nostra applicazione.
Mi spiego meglio:
se volessimo recuoerare quadrato_mc che si trova sullo stage dalla clip che abbiamo attaccato che si trova dentro container_mc?
Sappiamo che la famosa _root non esiste più e fino ad ora abbiamo utilizzato la tecnica di passare il valore dello stage dalla Document Class implementando la funzione costruttrice, della classe alla quale la MovieClip che abbiamo attaccato è associata, un parametro in ricezione che viene inserito in una proprietà.
Non è semplice spiegare a parole tutto ciò, per cui vi faccio degli esempi concreti...
Fino ad oggi, abbiamo utilizzato questa tecnica:
- un FLA che si chiama ' main.fla ' in cui abbiamo una MovieClip sullo stage con nome istanza ' container_mc ' ed un' altra con nome istanza ' quadrato_mc '.
- una Document Class di nome ' Main.as '
Code:
package
{
import flash.display.MovieClip;
public class Main extends MovieClip
{
public function Main()
{
}
}
}
- la classe associata alla MovieClip che abbiamo in libreria: nome della MovieClip: mc_clip, nome della classe Clip.as
Code:
package
{
import flash.display.MovieClip;
public class Clip extends MovieClip
{
private var _fla:MovieClip;
public function Clip(fla:MovieClip)
{
_fla=fla;
}
}
}
Attacchiamo mc_clip dentro a container_mc dalla Document Class in questo modo
Code:
package
{
import flash.display.MovieClip;
public class Main extends MovieClip
{
public function Main()
{
attachClip();
}
private function attachClip():void
{
var clip:MovieClip=new Clip(this);
container_mc.addChild(clip);
}
}
}
e se vogliamo recuperare quadrato_mc che è sullo stage da Clip.as
Code:
package
{
import flash.display.MovieClip;
public class Clip extends MovieClip
{
private var _fla:MovieClip;
public function Clip(fla:MovieClip)
{
_fla=fla;
trace(_fla.quadrato_mc);
}
}
}
Ma possibile che da Clip.as non ci sia modo di recuperare lo stage senza che venga passato dalla Document Class ?!?
Il modo c'è, utilizzando l' evento Event.ADDED_TO_STAGE .
Vediamo come.
Stessa Document Class:
Code:
package
{
import flash.display.MovieClip;
public class Main extends MovieClip
{
public function Main()
{
}
}
}
Clip.as diventa così:
Code:
package
{
import flash.display.MovieClip;
public class Clip extends MovieClip
{
public function Clip()
{
}
}
}
Se istanzio Clip da Main:
Code:
package
{
import flash.display.MovieClip;
public class Main extends MovieClip
{
public function Main()
{
attachClip();
}
private function attachClip():void
{
var clip:MovieClip=new Clip();
container_mc.addChild(clip);
}
}
}
e nella funzione costruttrice di Clip.as cerco di recuperare il parent ( che è container_mc, dato che è stata attaccata dentro a container_mc )
Code:
package
{
import flash.display.MovieClip;
import flash.events.Event;
public class Clip extends MovieClip
{
public function Clip()
{
trace(parent);
}
}
}
ottengo un bel null !
Questo accade perchè quando istanzio Clip la costruttrice cerca il parent per eseguire il mio trace ma non lo trova in quanto non è ancora stata inserita in container_mc perchè container_mc.addChild(clip); viene eseguito dopo che ho istanziato Clip. Ecco perchè dovevo passare il valore dello stage.
Se invece aggiungo a Clip un listener in ascolto dell' evento Event.ADDED_TO_STAGE, allora tutto funziona:
Code:
package
{
import flash.display.MovieClip;
import flash.events.Event;
public class Clip extends MovieClip
{
public function Clip()
{
addEventListener(Event.ADDED_TO_STAGE,go);
}
private function go(evt:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE,go);
var _root:MovieClip=parent.parent as MovieClip;
trace(_root.quadrato_mc);
}
}
}
Alla prossima !