Comunidad de diseño web y desarrollo en internet online

Esperar a que termine una acción antes de emperzar otra

Citar            
MensajeEscrito el 25 May 2009 03:28 pm
Muy buenas!

Tengo una función que simula el rastro que deja un personaje andando. Todo funciona bien cuando la ejecuto una vez. El problema aparece cuando quiero hacer cuatro tramos. Me gustaría que esperase a terminar uno, para empezar el siguiente, pero me dibuja los 4 a la vez.

Ésta es mi función:

Código :

for (var i:int=1; i < 5; i++) {
   posFin=Avanzar(posIni,4,90*i,0);
   posIni = posFin;
}

function Avanzar(origen: Array, numPasos:uint, orientacion:Number, numLinea:uint):Array {
   var frame:uint=0;
   var numFramesPaso=2;

   var destino:Array=ConvertirPasosPixel(numPasos,orientacion,origen);

   var destinoInt:Array = new Array ();

   var linea:MovieClip = new MovieClip ();
   linea.graphics.lineStyle(1);
   linea.graphics.moveTo(origen [0],origen [1]);

   var nombre:String="linea_"+String(numLinea);
   linea.name=nombre;

   this.addChild(linea);

   var segundos:Number=0.5;
   var intervalo:Timer=new Timer(segundos*1000);
   intervalo.addEventListener(TimerEvent.TIMER, playIt);
   intervalo.start();
   function playIt(e:TimerEvent) {
      ++frame;

      destinoInt [0] = origen [0] + (frame * (destino [0] - origen [0]) / (numPasos*numFramesPaso));
      destinoInt [1] = origen [1] + (frame * (destino [1] - origen [1]) / (numPasos*numFramesPaso));

      linea.graphics.lineTo(destinoInt [0], destinoInt [1]);
      Mimi.x=destinoInt[0];
      Mimi.y=destinoInt[1];
      if (frame >= (numPasos*numFramesPaso)) {
         intervalo.removeEventListener(TimerEvent.TIMER, playIt);
      }
   }
   return destino;
}


Muchísimas gracias.

Por astropajo

24 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 May 2009 04:55 pm
El problema es que el bucle for lanza los 4 timers a la vez.
Se me ocurren varias soluciones (todas parten de quitar el bucle)
1.-Ya que en un Timer le puedes indicar el número de repeticiones, puedes usar eso y el evento "timerComplete" para lanzar de nuevo la función

Código ActionScript :

//el Timer lo definimos fuera
var intervalo:Timer=new Timer(segundos*1000);
//La función playIt también debe estar fuera
 function playIt(e:TimerEvent) {
      ++frame;
      ....
}
//Creamos dos listener a "intervalo", el TimerEvent.TIMER y el TimerEvent.TIMER_COMPLETE, en la función y en el TIMER_COMPLETE es cuando llamamos de nuevo a la función Avanzar si una variable contador es menor de 5

2.-Usar un único timer (que se repita cuatro veces y cambiarlo de dirección cuando frame%(numPasos*numFramesPaso)==0

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 May 2009 06:46 pm
Muchísimas, muchísimas gracias.

La solución uno creo que me viene mejor. La voy a probar y te comento el resultado.

Un saludo

Por astropajo

24 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.