This is a discussion on Actionscript 3.0 e la classe Timer within the Articoli e tutorials forums, part of the Flash CS3 e Actionscript 3.0 category; Eccoci ad un'altra nuova classe Actionscript 3.0 .
La classe Timer è un miglioramento dei metodi setInterval e setTimeout e ...
Eccoci ad un'altra nuova classe Actionscript 3.0 .
La classe Timer è un miglioramento dei metodi setInterval e setTimeout e infatti Adobe consiglia di utilizzarla al loro posto.
Quando si crea un'istanza della classe Timer, non fa altro che eseguire un dato codice a intervalli regolari.
Si può specificare la velocità dell' intervallo e quante volte deve ripetere l' intervallo.
Vediamo un esempio...
Creo un FLA e salvo con nome ' prova_timer.fla ' .
Creo la Document Class, un file AS che salvo con nome ' Prova.as ' , strutturata in questo modo:
Code:
package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.geom.Point;
import flash.utils.Timer;
public class Prova extends MovieClip
{
private var numQuadrati:int=25;
private var lato:int=25;
private var distanza:int=10;
private var andata:Boolean=true;
private var clips_array:Array;
private var points_array:Array;
private var timer:Timer;
public function Prova()
{
clips_array=new Array();
points_array=new Array();
disegnaQuadrati();
posizionaQuadrati();
initTimer();
}
private function disegnaQuadrati():void
{
for(var i:int=0;i < numQuadrati;i++)
{
var sprite:MovieClip=new MovieClip();
sprite.graphics.beginFill(0x000000,1);
sprite.graphics.moveTo(-lato,-lato);
sprite.graphics.lineTo(lato,-lato);
sprite.graphics.lineTo(lato,lato);
sprite.graphics.lineTo(-lato,lato);
sprite.graphics.lineTo(-lato,-lato);
addChild(sprite);
clips_array.push(sprite);
}
}
private function posizionaQuadrati():void
{
var piccoloW:Number=Math.floor(this.parent.stage.stageWidth/5);
var piccoloH:Number=Math.floor(this.parent.stage.stageHeight/5);
for(var i:Number=0;i < 5 ;i++)
{
for(var j:Number=0;j < 5;j++)
{
var point:Point=new Point(piccoloW*j,piccoloH*i);
points_array.push(point);
}
}
for(var k:int=0;k < points_array.length;k++)
{
clips_array[k].x=lato*2+points_array[k].x;
clips_array[k].y=lato*2+points_array[k].y;
}
}
private function initTimer():void
{
timer=new Timer(100,clips_array.length);
timer.addEventListener(TimerEvent.TIMER,this.gestioneIntervallo);
timer.addEventListener(TimerEvent.TIMER_COMPLETE,finitoEffetto);
timer.start();
}
private function gestioneIntervallo(t:TimerEvent):void
{
if(andata)
{
clips_array[timer.currentCount-1].width+=20;
clips_array[timer.currentCount-1].height+=20;
}
else
{
clips_array[timer.currentCount-1].width-=20;
clips_array[timer.currentCount-1].height-=20;
}
}
private function finitoEffetto(TimerEvent):void
{
andata=!andata;
initTimer();
}
}
}
scusa io copio e incollo lo script ma mi da errore:
posizionaQuadrati(); non richiama nessuna fuznione
e piccoloW e piccoloH non sono state dichiarate se non sbaglio.
Cmq ho visto questo esercizio per sapere come fermare l'animazione alla pressione di un bottone, ho provato con timer.stop() ma non funge e poi o provato a rimuovere l'evento TimerEvent ma neanche li funge, come posso fare? Grazie 1000
una domanda: quando all'inizio disegni il pirmo quadrato, e lo fai "azando la penna" fuori dallo stage
sprite.graphics.moveTo(-lato,-lato);
è perchè una volta disegnato il suo baricentro si trova cosi nell'origine? è una
questione di comodita cosicchè facendo il punto di registrazione sia nel centro di ogni movieclip?
Ciao Flep, prima di tutto complimenti per i tuoi tutorial, trucchi e codici, veramente un gran lavoro, io ho una domanda stupida da porti.
Nel mio codice voglio semplicemente mettere una pausa senza lanciare un altra funzione, ma nella funzione stessa, ovvero :
Quindi, in teoria, dopo Timer.Start; ho la necessità di controllare, magari inserendo un boolean che cambia all'evento TIMER_COMPLETE, se lo stesso booleano sia cambiato all'interno di un ciclo while... ma questo non sembra possibile, correggimi se sbaglio... la classe timer non esegue una funzione (quella chiamata dall'evento TIMER o TIMER_COMP) se sta già eseguendo un altra funzione ? e come posso semplicemente crearmi una funzione di PAUSA della funzione che sto eseguendo ?
Spero di essermi spiegato bene e grazie mille per la tua eventuale risposta !!
Problema risolto a modo mio :D il codice lo posto se dovesse servire ad altri, se non è giusto dall'alto della vostra esperienza correggetelo :)
Code:
function Pausa(millisecondi:int):void
{
var TempoIni:int;
var TempoCor:int;
TempoIni=getTimer();
while (TempoIni +millisecondi > TempoCor)
{
TempoCor=getTimer();
}
}
Almeno funge per quel che serve a me :D ciau e grazie cmq