Cristalab

Retardar la ejecución de funciones en ActionScript 3

Por: Zguillez + 16.08.2007

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 miau

Etiquetas actionscript_3

Comentarios | Enviar un comentario
Cuantas veces he necesitado esta función con AS2!

Y ahora la tendré disponible para cuando cambie a AS3, y esto amigo Zguillez, es estupendo! Sonrisa

Gracias por tu tiempo.
Por: Sisco
Vientos huracanados, otro más para la colección de AS3 Guiño. Gracias.
Por: Rafeo
Puedes hacer que "_accion" sea de tipo Function (no String) y así le pasas directamente la referencia a la función, sin indicar la ruta.

Saludos.
Por: Zah
Si, cierto. se podría eliminar el pasar la referencia de la linea de tiempo, pero este dato tambien lo utilizo para saber el frameRate de la película. ¿sabrías como obtener este valor sin pasar referencia del stage a la clase?
Por: Zguillez
Bueno pasar una u otra cosa ya se adaptara dependiendo de lo que se necesite.
Por otro lado, en AS3 se puede hacer cast? para pasar el object nomas.

Buena Zguillez, muy buena ah
Por: carlosczg_blog
Muy buen tip Zguillez. Lo del boolean de segundos lo dejaría al boolean como una propiedad opcional, siendo "true" su valor por defecto. Muy util Thumbs up
Por: Freddie

Zguillez :

¿sabrías como obtener este valor sin pasar referencia del stage a la clase?


Sí, para eso sí que se necesita un displayObject U_U.
Por: Zah
Yay, las clases me matan... ¿Como puede una función tan sencilla de 3 lineas de código, que para hacerla clase necesite de 20 lineas mas !?
Ya, se que debe ser así. Por eso lo odio
mmmm

¿Seria posible esto?, un par de funciones del estilo:

Código :

function DelayTime(tiempo:Number):void{
var _timer:Timer = new Timer(tiempo, 1);
_timer.start();
}

Código :

function DelayFrames(frames:Number):void{
var _timer:Timer = new Timer(frames*1000/this.frameRate, 1);
_timer.start();
}

Así el programador va escribiendo el código, y coloca el Delay entre las instrucciones que quiera:


//...
mc1.play();
DelayTime(1000);(en ms)
mc2.play();
DelayFrames(10);
mc2.fuego.play();
//...

¿Funcionaria?

Nota: No tengo el Flash CS3 aquí, así que no lo he probado y lo hice de cabeza, si hay errores, sry, pero creo que se entiende.
Por cierto, Zah me dijo lo del frameRate, no lo conocía :p
Por: Bleend
Bleend, la cosa no es que sea así por complejidad, sino por reusabilidad. Si sólo copias y pegas la clase, la pones en tu classpath puedes reusarla en proyectos cuantas veces quieras.
Por: Freddie
Mirando estos códigos creo que por acá puede ir una respuesta que ando buscando, necesito poner una fotografía diferente en el frame 1, 2, 3, etc. y que su tiempo de "exposición" sea diferente, ahora si se puede agregar una transición tanto mejor, en lenguaje de mortales sería algo como "manten X tiempo en le frame 1, luego pasa al 2 y cuando se cumpla tu tiempo pasa la 3 y así sucesivamente". Habrá algún inmortal que me pueda ayudar con el código, gracias.
Por: ricodo
viendo todos estos comentarios tan grossos, pues, veo que hay cosas que ustedes los expertos saben ya de actionScript como si de cualquier asunto de la vida ordonaria se tratara, se que son asuntos de su vida ordinaria debido al trabajo que tienen, pero pues, abusando un poco de su confianza, se agradeciria un tutorial completo de todas las clases que hay en actionscript, por ejemplo, ese displayObject que mensionaron, que hace cada una de ellas, etc, etc, seria genial que nos hecharan la mano a los que tenemos menos posibilidades de asistir a clases particulares Triste
Por: Señor Oz_blog
agregando a lo anterior, se que ya nos hechan la mano, de hecho, pero hay cosas que aun se escapan por completo de nuestra comprension, hablo en nombre de todos los novatos que estan en mi situacion, claro. Gracias a todos los de Clab por lo que hicieron, hacen y haran, espero que sigan siempre.
Por: Señor Oz_blog
Siempre he pensado igual que Bleend, creas un código de 5 lineas y al hacerlo clase te quedan 50 Ownzed! .

Pero en fin, igual las hago Riendo .

Muy buen tip.
Por: Carloz.Yanez
Uh esto me viene como anillo al dedo, me las ingeniaba en AS2 para hacerlo pero esto me va a servir mucho, ya que empiezo a estudiar programación orientada a objetos.
Por: RiDaPe_blog
Mirando estos códigos creo que por acá puede ir una respuesta que ando buscando, necesito poner una fotografía diferente en el frame 1, 2, 3, etc. y que su tiempo de "exposición" sea diferente, ahora si se puede agregar una transición tanto mejor, en lenguaje de mortales sería algo como "manten X tiempo en le frame 1, luego pasa al 2 y cuando se cumpla tu tiempo pasa la 3 y así sucesivamente". Habrá algún inmortal que me pueda ayudar con el código, gracias.
Por: JL SALAS_blog
gente y donde hay algo para retrasar acciones, pero con as2?
Por: alphedo_blog
Esta interesante el ejemplo pero quisera saber como retrasar el return de una funcion. Por ejemplo un "function MOVER()" que dentro de ella haga un tween, y que retorne true si el movimiento termino. OJO no quiero que el evento Tween.MOTION_FINISH me ejecute algo sino que la function me retorne true. EL problema es que la funcion no espera si termino el tween , pasa defrente por el return
Por: Kalinchox_blog
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.