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