Comunidad de diseño web y desarrollo en internet online

Proyecto Cronos-As3 (Animacion con codigo)

Citar            
MensajeEscrito el 08 Jul 2007 10:03 pm
Primer paso a un sustituto de Fuse


Estoy desarrollando un motor de animación vía código, quiero llamarlo Cronos-As3, la intención es que sea openSource, así todos podrían aportar algo, o modificarlo a gusto de cada quien. Me vendría bien un poco de ayuda.

Su objetivo final es poder hacer lo mismo que Fuse de As2 http://www.mosessupposes.com/ , con funciones adheridas a los MoviesClips, ya sea como Movie.escalar( escalaX, escalaY, tiempo), y aparte que tenga la potencia de poder ejecutar funciones creadas por los usuarios de Cronos-As3 en un determinado instante o en una determinada secuencia de eventos.

La estructura del motor la estoy basando en setInterval(), lo que he logrado asta ahora es crear un pequeño motor que ejecuta funciones con una cronología determinada. En concreto desarrolle una clase llamada LineadelTiempo, que tiene como miembro las siguientes funciones:

•AgregarFuncion( func, tiempo );

Agrega una funcion (func), a un arreglo que también contiene el dato de en que momento (Tiempo) debe ejecutarse dicha función.

El arreglo se llama ListadeFunciones su estructura contiene a su ves otro arreglo de solo dos elementos, el primero de ellos, a su ves es otro arreglo, en este ultimo es donde se guardan las funciones que se desean ejecutar en un mismo instante de tiempo, esta estructura permite ejecutar mas de una función en un mismo instante de tiempo.




Otra manera de ver esta estructura es la siguiente, (un poco más digerible):





•CronologiaF();

Esta función es invoca las funciones que deseamos ejecutar en un determinado tiempo, se apoya en una variable apuntadorF, que indica en que renglón nos encontramos. Con forme avanza el tiempo la función checa si ya es hora de ejecutar las funciones enlistadas en el actual renglón, si es así estas funciones se ejecutan, y el apuntadorF se incrementa para saltar al renglón siguiente y esperar el momento en que deben ser ejecutadas.




Otra manera de visualizar lo anterior.




•EmpezarF();
Esta función crea un setInterval() que ejecuta de manera iterativa la función CronologiaF();. La variable intervalo determina la cantidad de tiempo entre una iteración y otra.

Su código es:

public function EmpezarF() {//Inicializa la linea del tiempo
CronosF = setInterval(CronologiaF, intervalo);
}

El código completo de la clase es:

Código :


package Tiempo{
   import flash.display.Sprite;
   import flash.utils.*;
   public class LineadelTeimpo {
      //
      public var intervalo:Number = 10;
      public var ListadeFunciones:Array=new Array;
      public var tiempo:int=-1;
      var apuntadorF:int=0;
      var CronosF:uint;

      //
      public function LineadelTeimpo() {//Constructor
      }
      //
      public function EmpezarF() {//Inicializa la linea del tiempo
         CronosF=setInterval(CronologiaF,intervalo);
      }
      //
      public function AgregarFuncion(func:Function,tiempo:Number) {//Agrega una funcion a la lista
         var array:Array=new Array(func);//crea el tercer areglo para cada renglon
         var listo:Boolean=false;//determina si ya se agrego la funcion a la lista para no realizar iteraciones insecesarias
         if (ListadeFunciones.length == 0) {//si no hay elementos en la lista principal lo agrega en el inicio
            ListadeFunciones.push([array,tiempo]);
            listo=true;
         }
         if (ListadeFunciones.length > 0) {//en caso de que la lista principal tenga elementos busca el lugar apropiado para la nueva funcion, agrega las funciones en orden cronolojico
            var Fi:int;//esta variables es para realizar iteraciones en el for
            if (ListadeFunciones[ListadeFunciones.length - 1][1] < tiempo) {//verifica que el tiempo del ultimo renglon sea menor que el nuevo tiempo, si es asi anexa un nuevo renglon al final
               ListadeFunciones.push([array,tiempo]);
               listo=true;
            }
            for (Fi=0; Fi < ListadeFunciones.length; Fi++) {
               if (listo) {
                  break;
               }
               if (ListadeFunciones[Fi][1] > tiempo) {
                  //agrega un nuevo renglon en medio de la lista prinsipal
                  ListadeFunciones.splice(Fi,0,[array,tiempo]);
                  break;
               }
               if (ListadeFunciones[Fi][1] == tiempo) {
                  //agrega funciones a un momento de tiempo ya existente, es decir agrega la funcion a un renglon que ya existe
                  ListadeFunciones[Fi][0].push(func);
                  break;
               }
            }
         }
      }
      //
      function CronologiaF():void {
         //ejecuta las funciones en el tiempo indicado
         tiempo++;
         var Li:int;
         var listo:Boolean=false;
         if (0 == ListadeFunciones.length) {
            trace("Termino de Funciones");
            clearInterval(CronosF);
         }
         if (ListadeFunciones[apuntadorF][1] == tiempo * intervalo / 1000) {
            for (Li=0; Li < ListadeFunciones[apuntadorF][0].length; Li++) {
               if (listo) {
                  break;
               }
               ListadeFunciones[apuntadorF][0][Li]();
            }
            if (apuntadorF < ListadeFunciones.length - 1) {
               apuntadorF++;
            } else {
               trace("Termino Funciones");
               apuntadorF=0;
               tiempo=0;
               clearInterval(CronosF);
            }
         }
      }
      //
   }
}



La variable tiempo = -1 lleva la cuenta del tiempo transcurrido al momento de activar a setInterval()

Para finalizar agrego un ejemplo del uso de la clase, este es el código que debe ir dentro del .fla:

Código :

//FilosDelta OpenSource

import Tiempo.*;//importamos la clase

var Linea1:LineadelTeimpo = new LineadelTeimpo(); //creamos una instancia de la clase

//escribimos una funcion cualquiera
function prueba() {
   trace("ejecucion")
}

//agregamos esta funcion a la instancia de la clase para se ejecutada en diferentes tiempos
Linea1.AgregarFuncion(prueba,1);
Linea1.AgregarFuncion(prueba,3);
Linea1.AgregarFuncion(prueba,2);
Linea1.AgregarFuncion(prueba,1);

//Comenzamos la secuencia
Linea1.EmpezarF();



Espero que esto esa una plataforma sólida para que los que no se han animado comiencen a migrar a AS3, en lo personal ya le perdí el miedo.

Aquí pueden bajar el ejemplo completo. http://www.delasletras.com/Files/elecatec.zip

Por filosdelta

1 de clabLevel



Genero:Masculino  

msie7
Citar            
MensajeEscrito el 22 May 2009 06:15 pm
Hummm, bastante interesante. ^^
¿Sabéis si ha proliferado este proyecto o hay algo parecido ya hecho para AS3?

Por jesusmmago

16 de clabLevel



 

firefox

 

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