This is a discussion on onEnterFrame con Flash CS3 within the Articoli e tutorials forums, part of the Flash CS3 e Actionscript 3.0 category; Qualcuno di voi ha paura che il metodo MovieClip onEnterFrame sia stato rimosso?
Paura non fondata, in quanto non è stato ...
Qualcuno di voi ha paura che il metodo MovieClip onEnterFrame sia stato rimosso?
Paura non fondata, in quanto non è stato rimosso ma solo ottimizzato e quindi cambia un po il modo di utilizzarlo.
Con AS 2.0 bastava dire: nomeMovieClip.onEnterFrame=function, con AS 3.0 tutto questo non è più applicabile.
Come fare ? Mi spiego subito... Creo un FLA e lo salvo con nome ' onEF.fla ' .
Creo 3 MovieClips , di cui due con forma circolare ed unacon forma quadrata.
Le chiamo rispettivamente: clip_0_mc, clip_1_mc, clip_2_mc.
Creo la Document Class, un file AS che salvo con nome ' Prova.as' e scrivo:
Code:
package
{
import flash.display.MovieClip;
import flash.events.Event;
public class Prova extends MovieClip
{
private var boo:Boolean=true;
public function Prova()
{
initListeners();
}
private function initListeners():void
{
clip_0_mc.addEventListener(Event.ENTER_FRAME,muoviDueClips);
clip_0_mc.addEventListener(Event.ENTER_FRAME,muoviLaTerzaClip);
}
private function muoviDueClips(e:Event):void
{
clip_0_mc.visible=boo;
clip_1_mc.rotation--;
boo=!boo;
}
private function muoviLaTerzaClip(e:Event):void
{
clip_2_mc.rotation++;
}
}
}
Risultato:
Da questo esempio riusciamo a capire che, mentre in AS 2.0 si richiamavano funzioni da un intervallo in questo modo:
Code:
my_mc.onEnterFrame=function():Void
{
chiamaUno()
chiamaDue();
}
function chiamaUno():Void
{
//codice da eseguire
}
function chiamaDue():Void
{
//codice da eseguire
}
con AS 3.0 , associamo un listener alla MovieClip e passiamo al listener 2 parametri: un evento (in questo caso ENTER_FRAME e il nome della funzione da richiamare).
Tutto questo è molto più pulito, è in rispetto delle buone norme della Object Oriented Programming e possiamo richiamare multiple funzioni.
Ciao flep sempre complimenti per il sito, lo sto presentando a molti miei amici e lo trovano tutti molto utile.
Ti chiedo giusto una stupidata riguardo enterframe.
mettiamo che una funzione A faccia spostare una movieclip ad esempio con l'inerzia.
A ovviamente la rchiamo con un tasto a cui assegno l'evento ENTER_FRAME.
Poi ovviamente rimuovo ENTER_FRAME una volta che la movieclip è arrivata al limite cosi non ci sono calcoli inutili.
la questione è: e se creo una funzione B che (mentre sta ancora muovendosi la movieclip grazie ad A) fa ripartire A nel senso opposto (magari al MOUSE_OVER), semplicemente perchè la funzione B richiama A assegnandogli un parametro diverso, in quel caso succede che:
se B viene azionata quando ha terminato il suospostamento, all'avvio di B c'è solo un ENTER_FRAME attivo
se B viene azionata quando A è ancora in movimento, l'ENTER_FRAME di B si aggiunge a quello di A.
Da notare che sono entrambi gli stessi enterframes perchè B funziona come il tasto che aveva fatto partire A, in pratica è la medesima riga di codice.
Di conseguenza, una volta terminata la questione, andranno rimossi 2 ENTER_FRAMES o con un remove si eliminano tutti e due nello stesso momento (essendo uguali)? ti posto il codice
var dy:Number=arrivoPortfolioMenuY-e.target.y
var ay:Number=dy*0.05
e.target.y+=ay
if (Math.abs(ay)<=0.1)
{
e.target.removeEventListener(Event.ENTER_FRAME,sli dePortfolioMenu)
}
ovviamente non posso fare altrimenti, perche volgio che la movieclip torni indietro a scelta sia se sta ancora muovendosi sia se ha gia finito lo spostamento, quindi l'ultimo ENTER_FRAME nella funzione slideUp devo metterlo per forza!!!
Personalmente non lavorerei con 2 listeners e 2 ENTER_FRAME associati.
Lavorarei sempre con un solo ENTER_FRAME sempre attivo e in base ad una variabile Booelan la MovieClip va avanti oppure indietro.
In pratica una se va boo:Boolean è true ( che saranno i tasti ad impostarla a true oppure false ) allora la MovieClip fa +=speed; se invece è false la MovieClip fa -=speed.
hai ragione....come dici tu è decisamente più semplice immediato e schematico.
Io temevo solo che lasciare un ENTER_FRAME sempre attivo affaticasse il calcolo e quindi i tempi di scaricamento e funzionamento del sito.
Se non è una cosa cosi grave allora di sicuro come dici tu è la soluzione migliore ;)
Un ENTER_FRAME sempre attivo è poca cosa per una CPU.
Certo che se dovessi avere ad esempio 20 MovieClip con 20 ENTER_FRAME attivi allora il discorso cambierebbe.
una seconda questione, o arcani luminari dei codici:
come si fa quando una funzione può essere chiamata da molteplici eventi: ad esempio puo avvenire subito con un timer, poi la volta dopo con il tasto del mouse, la terza con un enter_frame.......
si scrive tale quale tre volte la funzione variando solo i parametri tra parentesi?