Eccoci ad n altro trucchetto che può risultare molto utile.
Questo articolo prende spunto da questa discussione:
Document Class
Abbiamo visto fino ad oggi che spesso dobiamo passare il valore della root principale della nostra applicazione dalla Document Class alle alle classi che compongono la nostra applicazione.
Questo perchè alle volte necessitiamo di recuperare una MovieClip che abbiamo sullo Stage e quindi se non avessimo quel valore passato dalla Document Class non riusciremmo a risalire alla MovieClip.
In poche parole, con Actionascript 2.0 era facile, bastava dire _root.nomeMovieClip ( cosìdetta Composition ) che da qualsiasi classe si risaliva ad una MovieClip sullo Stage.
Con Actionscript 3.0 _root è stata rimossa dato che l' intero concetto di livelli e timeline è stato cambiato.
Faccio un esempio:
ho main.fla al quale è associata la Document Class Main.as e sullo Stage ho una MovieClip che chiamo test_mc. Nella libreria di main.fla ho un' altra MovieClip, associata ad una classe ( linkage o identificatore ) chiamata Clip.as, che voglio attaccare (
ex metodo attachMovie ) dalla Document Class.
Vediamolo...*
Creo un FLA che salvo con nome ' main.fla ' .
Al suo interno creo una MovieClip che istanzio sullo Stage e gli associo nome istanza ' test_mc '.
Creo un' altra MovieClip , che però lascio in libreria con nome ' mc_clip ', associata tramite linkage ( identificatore ) alla classe Clip.
Ora creo la Document Class che associo a main.fla, un file AS che salvo con nome ' Main.as ', implementata in questo modo:
Code:
package
{
import flash.display.MovieClip;
public class Main extends MovieClip
{
public function Main()
{
var clip_mc:MovieClip=new Clip();
addChild(clip_mc);
clip_mc.callBack();
}
}
}
Creo anche la classe Clip.as, che è associata alla MovieClip mc_clip in libreria di main.fla:
Code:
package
{
import flash.display.MovieClip;
public class Clip extends MovieClip
{
public function Clip()
{}
public function callBack():void
{
var m:MovieClip=this.root as MovieClip;
m.test_mc.x=0;
m.test_mc.y=0;
}
}
}
Analizziamo cosa succede quando pubblico l' SWF:
- main.fla chiama la Document Class ( Main.as )
- come abbiamo visto nella prima lezione della Object Oriented Programming (
creare la mia prima classe Actionscript 3.0 ), la classe Main esegue subito il codice nella funzione costruttrice:
istanzio la classe Clip che è associata a mc_clip ( in libreria di main.fla )
var clip_mc:MovieClip=new Clip();
la aggiungo allo Stage ( a questo punto abbiamo mc_clip visibile sullo stage )
addChild(clip_mc);
chiamo il metodo callBack che ho implementato nella classe Clip
clip_mc.callBack();
- il metodo callBack vuole spostare le coordinate di test_mc. Per farlo utilizza la proprietà root che restituisce il padre in cui si trova mc_clip ( ricordiamoci che scrivendo nel file Clip.as è come se scrivessimo nella timeline di clip_mc ). Infatti se proviamo con un trace(this.root), l' ouput sarà il seguente: [object Main]. Quindi con this.root risaliamo a Main. Ora, in teoria se scrivessimo this.root.test_mc dovremmo risalire appunto a test_mc ma così non è in quanto Flash restituisce un errore:
1119: Access of possibly undefined property test_mc through a reference with static type flash.display:DisplayObject.
- quindi ecco il trucchetto:
var m:MovieClip=this.root as MovieClip;
m.test_mc.x=0;
m.test_mc.y=0;
forzo this.root a tipizzarsi MovieClip inserendolo in una variabile di tipo MovieClip e a quel punto mi riconosce test_mc e posso interagire completamente.
Stay tuned !