Comunidad de diseño web y desarrollo en internet

Retardar la ejecución de funciones en ActionScript 3

Este pequeño Tip es para mostrar una clase de ActionScript 3 que permite retrasar un cierto tiempo la ejecución de una acción de flash.

Este es un tema bastante preguntado en los foros, y es de fácil solución: Únicamente hay que crear un controlador de tiempo (TimerEvent.TIMER en AS3 o setInterval en AS2) que ejecute la acción deseada en el tiempo que le indiquemos.

Código :

var _timer:Timer = new Timer(_tiempo, 1);
_timer.addEventListener(TimerEvent.TIMER, accion);
_timer.start();


Creándonos una clase y colocandola dentro de nuestro package de tools o utilidades podremos hacer el código más reutilizable.

Esta sería la clase Delay.as:

Código :

package com.zguillez.utils
{
   import flash.display.Sprite;
   import flash.utils.Timer;
   import flash.events.TimerEvent;
   //------------------------------------------
   public class Delay
   {
      private static var _ruta:Sprite;
      private static var _tiempo:Number;
      private static var _timer:Timer;
      private static var _accion:String;
      //------------------------------------------
      public static function action(tiempo:Number,segundos:Boolean,ruta:Sprite,accion:String)
      {
         _ruta = ruta;
         _accion = accion;
         _tiempo = (segundos == true) ? tiempo * 1000 : tiempo / _ruta.stage.frameRate * 1000 ;
         _timer = new Timer(_tiempo, 1);
         _timer.addEventListener(TimerEvent.TIMER, ejecuta);
         _timer.start();
      }
      //------------------------------------------
      private static function ejecuta(event:TimerEvent)
      {
         _ruta[_accion]();
      }
      //------------------------------------------
      public static function reset()
      {
         _timer.reset();
      }
      //------------------------------------------
   }
}


Las funciones y propiedades son estáticas para NO necesitar instanciar la clase (constructor new). Así que para usarla en nuestro .fla o dentro de otra clase pondríamos esto:

Código :

import com.zguillez.utils.Delay

Delay.action(3, true, this, "saluda")

function saluda()
{
   trace("hola");
}


De esta manera la función "saluda" se ejecutará a los 3 segundos de haber hecho la llamada.

Como parámetros a la función "accion" le pasaremos un boolean indicándole si el valor numérico son segundos o fotogramas.

Código :

_tiempo = (segundos == true) ? tiempo * 1000 : tiempo / _ruta.stage.frameRate * 1000 ;


Tambien le indicaremos la ruta de la función a ejecutar con lo que puede estar dentro de cualquier MovieClip o clase.

La clase dispone de una función "reset" que permite cancelar la ejecución de la función en el caso de que aun estemos a la espera.

Espero que les sea útil ^^

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate