2012-09-19 20 views
5

¿Cómo se crea un contador de tiempo en as3? Una búsqueda simple en google lo dirigirá al temporizador de clase AS3 que en realidad es un contador de eventos y no es una utilidad de conteo de tiempo adecuada.creando un contador de tiempo (correcto) en AS3

He visto esto http://blogs.adobe.com/pdehaan/2006/07/using_the_timer_class_in_actio.html y estoy un poco preocupado por el hecho de que es la documentación oficial lo que debería funcionar.

Q: ¿Dónde está exactamente el problema?

A: La clase del temporizador ejecuta operaciones en una pila de eventos y si tiene una aplicación bastante pesada puedo apostar que el temporizador distorsionará su tiempo si lo usa para contar segundos, milisegundos o lo que sea.

Respuesta

1

¿Cómo anulas esto?

Simplemente utilizamos la clase Fecha también en una secuencia de comandos que contará correctamente el tiempo.

  1. Crear un nuevo documento AS3
  2. añadir 3 cuadros de texto con nombre minText, secText, MilText y un botón de llamada start_btn
  3. añadir este código en el primer fotograma:

var STT: int; // utilizamos esta variable para hacer un seguimiento de la hora de inicio como una marca de tiempo
var myTimer: Timer = new Timer (1); // este es nuestro temporizador

var starttime:Date; // pretty obvious 
var actualtime:Date; // pretty obvious 

myTimer.addEventListener(TimerEvent.TIMER, stopWatch); // we start counting with this counter 

start_btn.addEventListener(MouseEvent.CLICK, startClock); // add a button listener to start the timer 

function startClock(event:MouseEvent):void 
{ 
    starttime = new Date(); // we get the moment of start 
    stt = int(starttime.valueOf().toString()); // convert this into a timestamp 
    myTimer.start(); // start the timer (actually counter) 
} 

function stopWatch(event:TimerEvent):void 
{ 
    actualtime = new Date(); // we get this particular moment  
    var att:int = int(actualtime.valueOf().toString()); // we convert it to a timestamp 

    // here is the magic 
    var sec:int = (Math.floor((att-stt)/1000)%100)%60; // we compute an absolute difference in seconds 
    var min:int = (Math.floor((att-stt)/1000)/60)%10; // we compute an absolute difference in minutes 
    var ms:int = (att-stt)%1000; // we compute an absolute difference in milliseconds 

    //we share the result on the screen 
    minText.text = String(min); 
    secText.text = String(sec); 
    milText.text = String(ms); 
} 

¿Por qué necesita marcas de tiempo y no usa las funciones de la clase Date?

Porque si se desea contar la diferencia entre dos eventos es probable que utilice esto:

 endEvent.seconds - startEvent.seconds 

que es muy malo si el evento de inicio ocurre en el segundo 57'th y el evento final que ocurre en el 17º segundo, obtendrías -40 segundos en lugar de 20, y así sucesivamente.

+1

'flash.utils.getTimer()' es más eficiente, según otra respuesta – BadFeelingAboutThis

5

Si lo que busca es precisa medida intervalos cortos de tiempo que acaba de utilizar la función getTimer() (flash.utils.getTimer), que devuelve el número de milisegundos transcurridos desde que se inició flash player. La clase simple cronómetro prototípico es:

public class StopWatch { 
    private var _mark:int; 
    private var _started:Boolean = false; 

    public function start():void { _ 
     mark = getTimer(); 
     _started = true; 
    } 

    public function get elapsed():int { 
     return _started ? getTimer() - _mark : 0; 
    } 
} 

More Info:

+0

Esto es definitivamente mejor que usar el 'date' clase – BadFeelingAboutThis

+0

tengo Existe una pequeña duda ya que Date() depende de la hora del sistema, pero getTimer() se basa en la máquina virtual de tiempo de ejecución de Flash. Debería probarse, pero creo que en aplicaciones pesadas también puede retrasarse. – Mike

+0

@mugur ¿En qué basas eso? De cualquier manera, le está pidiendo al sistema operativo subyacente el tiempo específico del sistema o los tics del sistema (vea por ejemplo http://en.wikipedia.org/wiki/GetTickCount) –

Cuestiones relacionadas