Salve a tutti,
quanto andrò a mostrare non fa sicuramente parte delle buone norme di programmazione Actionscript, ma data la numerosa comunità di Flash Designers, sarà sicuramente utile.
Mi è capitato spesso di ricevere richieste di aiuto su come gestire le timeline delle MovieClip sullo stage o di MovieClip annidate una dentro l' altra. Soprattutto di come poter riferirsi alla
Document Class dalle MovieClips sullo stage e da quelle annidate in loro.
Spero con questo esempio di aiutare a comprendere questa comunicazione tra timeline e Document Class sempre però ricordando che*è meglio scrivere codice solo sulla Document Class oppure,*se proprio*non ne potete fare a meno, di scriverlo nella timeline principale senza spargerlo per tutta l' applicazione.
Entriamo nel sodo...
Creo un FLA che salvo con nome ' main.fla '.
Al suointerno creo una MovieClip e la istanzio sullo stage con nome clip_mc.
Questa MovieClip ha al suo interno un' animazione composta da circa 30 frames che la sposta da sinistra verso destra.
Adesso creo la Document Class, 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()
{
clip_mc.stop();
}
public function PlayClip():void
{
clip_mc.play();
}
public function aumentaY():void
{
clip_mc.y+=60;
}
}
}
Come possiamo notare, abbiamo la funzione costruttrice ( public function Main ) che ferma la timeline di clip_mc che abbiamo sullo stage.
Inoltre abbiamo due metodi ( o funzioni ) pubblici ( così riachiamabili anche dall' esterno della classe ) di cui :
PlayClip, se chiamato, farà partire la timeline di clip_mc che è sullo stage
aumentaY, se chiamato, incrementerà la proprietà y di clip_mc che è sullo stage
A questo punto andiamo a vedere come chiamare questi 2 metodi dalla timeline:
sul primo e unico keyframe della timeline principale scrivo PlayClip(); e lanciando l' SWF mi accorgerò che clip_mc sta andando verso destra, ciò significa che la sua timeline è stata fatta partire... da chi ? Appunto dalla chiamata al metodo PlayClip(). La cosa davverobella è che in questo modo ho chiamato una funzione che è implementata nella Document Class. Questo dovrebbe far capire a chi ancora ha dubbi sulla Document Class che scrivere sulla Document Class è come se stessimo scrivendo sulla timeline, infatti la chiamata PlayClip dalla timeline sembra che sia verso una funzione implementata nella timeline stessa.
Detto questo, supponiamoora che avessimo bisogno di chiamare un metodo sempre della Document Class dall'ultimo keyframe dell' animazione nella timeline di clip_mc. Come fare ?
Ho fatto diverse prove e ora ve le illustro:
ho provato a scrivere appunto sull' ultimo keyframe di clip_mc : trace (this.parent); e l' output ottenuto è stato: [object Main]. Questo significa che la timeline principale stessa del nostro main.fla è una istanza della classe Main che abbiamo creato. Per cui, a rigor di logica se io chiamassi:
this.parent.avanzaY(); flash dovrebbe chiamare il metodo avanzaY che è nella Document Class... ma non è così... infatti se proviamo Flash ci dice con un errore che this.parent non ha un metodo che si chiama avanzaY ( che strano eh )...
Allora sono ricorso alla 'variabile universale ':
var m:*=this.parent;
m.aumentaY();
creo una variabile che possa ospitare qualsiasi tipo di dato/valore e gli assegno this.parent. Poi chiamo avanzaY con la variabile m.
Allego i files sorgente: