Trasteando con "The fuse kit"
¿Alguien de vosotros ha usado fuse?
Siempre he usado <code>#include "mc_tween2.as"</code> para hacer los tween y hace unos días ví (si, voy con retraso) que se usaba la versión actualizada de los tween de laco <code>#include "lmc_tween.as"</code> y n el mismo momento descubrí fuse y por lo poco que he descubierto pinta bastante bien. Es más complejo pero te permite cosas como agrupar diferentes transformaciones de tween, ponerles nombre, vaya, una joya. El caso es q estoy haciendo unas pruebas con <code>import com.mosesSupposes.fuse.*;
ZigoEngine.simpleSetup(Shortcuts, PennerEasing);</code> es decir, con lo más básico aka "para torpes" y he intentado hacer lo q en otro post para hacer un tween a una variable <code>this.i=0;
this.tween("i",100,1,"easeOutQuint");
this.onTweenUpdate = function() {
trace(this.i);
}</code>
pero no me chuta. Sé que ahora funciona con un listener (ok, hace tiempo) pero lo que creo no me va bien.
<code>import com.mosesSupposes.fuse.*;
ZigoEngine.simpleSetup(Shortcuts, PennerEasing);
var listenr:Object = {};
listenr.onTweenUpdate = function() {
trace(???);
}
testclip.tween("_x", 350, 1, "easeInOutQuint");
testclip.addListener(listenr);</code>
No sé q poner en ??? ni como pasar x parametro ni nada. :S
Es curioso porque el tween está documentadísimo en todos lados pero algo tan tonto como un tween a variable me cuestra horrores encontrarlo :S
No sé si seguir con el tween prehistórico o q :S
¿Alguien con una experiencia más reciente en el tema?
Usuario desconocido
El código que puse sí que me funcionaba, quizá te faltaría el código que iba en los puntos suspensivos :-P
Y para lo que pides, podemos aprovechar que MovieClip es una clase dinámica y le podemos encasquetar propiedades al vuelo, aunque esto no sea muy correcto en OOP...
<code>
import com.mosesSupposes.fuse.*;
ZigoEngine.register(Fuse, PennerEasing, FuseFMP);
var f:Fuse = new Fuse();
for (var i:Number=1; i<=5; i++) {
var mc:MovieClip = this["mc"+i];
mc.prop = 0;
f.push({target:mc, prop:100, updfunc:onUpdate, updargs:mc, delay:i});
}
f.start();
function onUpdate(mc:MovieClip):Void {
trace(mc._name + " " + mc.prop);
}
</code>
En el ejemplo tweeneamos una propiedad nueva llamada 'prop' de cada MovieClip.
un saludo
ozke
La otra putada es... si tengo q hacer el push a 5 movieclips ejecutandose a la vez xo cn dsfase (necesito ir modificando 5 variables/arrays), tengo q declarar 5 arrays? :S
ozke
Eso último q has puesto no me funciona. No se si es pq aún estoy testeando y no estoy haciendo las cosas en OOP.
Sea como sea, creo q igualmente te mereces el titulo de "Authorized Fuse trainer" de dmstk :)
Usuario desconocido
Eso es porque cuando termina la llamada a la función la variable que has definido dentro se elimina, y el fuse no puede acceder a ella.
Tendrás que usar una variable que esté en un ámbito donde permanezca viva mientras se ejecuta el fuse, y como target al fuse le deberás pasar el objeto/propietario que ha definido el array, en mi ejemplo era this.
De todas formas si defines el fuse dentro de una funcion podrias usar algo asi:
<code>
...
var miArray:Array = [0, 0];
var ref:MovieClip = this;
public function defineFuse():Void {
fuse.push({target:ref, miArray:[100, 50], updFunc:miUpdate, updArgs:miArray});
}
...
</code>
un saludo
ozke
Eso sí funciona :P.
Muchas gracias tio.
Una curiosidad, si lo mismo q me funciona d tu ejemplo lo hago con fun fuse metido en una función no chuta. He metido la variable d la q hace uso dentro d la función y nada. Lo único q me va es sacar la variable y poner como target al fuse _root. Pero m parece un poco warro. :P
¿Es normal?
Usuario desconocido
Bueno, pues entonces vamos a tirar de la posibilidad de tweenear arrays:
<code>
var miArray:Array = [0, 50];
var f:Fuse = new Fuse();
f.push({target:this, miArray:[100, 200], updfunc:onUpdate, updargs:[miArray]});
f.start();
function onUpdate(p:Array):Void {
trace("valor1: " + p[0] + " valor2:" + p[1]);
}
</code>
En este ejemplo va a tweenear los valores de miArray, desde 0 a 100 y desde 50 a 200. Luego en tu función puedes usar esos valores para lo que quieras.
ozke
Pero entonces el valor q lea para generar la funcion será siempre 100 :S
Usuario desconocido
Puedes usar otro pequeño truco, que consiste en tweenear una propiedad a un valor que ya tiene, por ejemplo el alpha a 100, tu no vas a ver ningún cambio pero el tween lo va a hacer :-P
ozke
No si ya se lo de los callbacks. Lo q quiero es q ese updfunc llame a una funcion (hasta aqui ok) pero q esta funcion me haga un trace de una variable xxx y no de una propiedad. No tiene q ser chungo pero llevo un lío...
Usuario desconocido
Tambien puedes definir callbacks para el objeto ZigoEngine de la siguiente forma:
<code>function onTweenUpdate(mc:MovieClip):Void{
trace("update: "+mc);
}
function onTweenEnd(mc:MovieClip):Void{
trace("tween end in: "+mc);
}
ZigoEngine.doTween(mc,"_x",100,1,"easeOutExpo",0,{scope:this, func:'onTweenEnd', args:mc, updscope:this, updfunc:'onTweenUpdate', updargs:mc})</code>
En la documentación se pueden ver más propiedades del objeto callback.
ozke
Cuando uso en lugar d x... xy no me funciona :S
ozke
Ardo en deseos de llegar a casa y probarlo ;)
Muchas gracias una vez más :P
Usuario desconocido
Pues podría ser algo así:
<code>
var f:Fuse = new Fuse();
f.push({target:mc1, x:200, updfunc:onUpdate, updargs:mc1});
f.push({target:mc2, x:200, updfunc:onUpdate, updargs:mc2});
f.start();
function onUpdate(target:MovieClip):Void {
trace("updating " + target._name + " " + target._x);
}
</code>
Pero sustituyendo x por alguna propiedad no tweeneable, como 'xy' o cualquiera que no exista.
ozke
Mmm... justo lo q buscaba :D Genial.
La versión fuse d esto como sería? :? :mrgreen:
Usuario desconocido
Sacado de los docs de ZigoEngine:
<code>
var myListener:Object = {
onTweenStart:function(o:Object):Void {
trace("Tween started on:"+o.target._name+" ["+o.props.toString()+"]");
},
onTweenUpdate:function(o:Object):Void {
trace("Tween updating on:"+o.target._name+" ["+o.props.toString()+"]");
},
onTweenEnd:function(o:Object):Void {
trace("Tween completed on:"+o.target._name+" ["+o.props.toString()+"]");
}
};
// if simpleSetup was not used, initialize targets first to accept listeners
ZigoEngine.initialize(clip1, clip2);
clip1.addListener(myListener);
clip2.addListener(myListener);
ZigoEngine.doTween(clip1,"_alpha",0,2);
ZigoEngine.doTween(clip2,"_scale",200,2);
</code>
Como puedes ver utiliza un solo listener.
ozke
msanchez
Ok, entiendo. Entonces no hace falta usar Fuse, puedes usar solamente ZigoEngine.doTween(...loquesea...) y suscribirte a su evento onTweenUpdate.
Y con que te suscribas una vez sobra, puesto que el objeto que te envía como parámetro contiene el target que ha sido 'tweeneado'.
saludos
:|
No se si te entiendo, la primera parte ok, ya es lo q hacía. El problema no es el tween. El problema es q el tween solo me sirve para cambiar una variable que me sirve para ir llamando a una funcion cada vez q se actualiza el tween (onTweenChanged).
1. Creo el listener sobre A
2. Llamo al tween sobre un objeto A
3. Cada vez q el tween cambia el valor d la variable yo llamo a la funcion q hace algo sobre A
Si en lugar de A tengo A, B, C, D, E... tengo q usar varios listeners no?
Usuario desconocido
Ok, entiendo. Entonces no hace falta usar Fuse, puedes usar solamente ZigoEngine.doTween(...loquesea...) y suscribirte a su evento onTweenUpdate.
Y con que te suscribas una vez sobra, puesto que el objeto que te envía como parámetro contiene el target que ha sido 'tweeneado'.
saludos
ozke
Pues quiero hacer un tween de algo no tweeneable. Es decir, imaginate que quiero dibujar una espiral, un circulo, un triangulo con curvas, nose.
Pues bien, yo uso una funcion dibujarAlgo, pero para que haga x ejemplo una espiral con aceleración uso tween. Un tween al movieclip dnd se dibuja la espiral pero en lugar de cambiar _x, _y o lo q sea le cambio XXX.
Detectando por onMotionChange como va cambiando la variable XXX la uso para ir redibujando la espiral. Eso, aplicado a multiples espirales q no se crean al mismo tiempo creo q me obligaría a usar varios listeners pq cada XXX irá cambiando a su bola.
No sé si me he explicado bien.
Usuario desconocido
Qué quieres conseguir exactamente?
Lo digo porque a lo mejor puedes evitar el uso del onTweenUpdate, o como se llame en Fuse.
ozke
Si tengo varios clips que se ejecutan con un pequeño desfase el uno del otro y quiero q cada uno tenga su propio onTweenUpdate tengo q crear un listener para cada uno de ellos?
El onTweenUpdate hace lo mismo para todos, pero cada uno en relacion a su clip claro.
hardface
Lo mismo me pasa a mi, con las de Zeh voy sobrao, aunque oyendo esas maravillas de Fuse... habrá que investigarlo...
Goio Telletxea
Ozke, has dado en el clavo. En todo lo que has dicho. Me siento identificado. :)
ozke
Bueno, animar a frames a veces es necesario. Véase interpolaciones de forma determinadas.
Lo q comentas es interesante pq yo no me he metido con muchas cosas nuevas de flash x eso. Pq cn lo q sé me voy apañando siempre... y llega el dia q t paras (m pasa ahora) y levantas la cabeza y ves... flash 9 a punto de salir... flex flix flox flux... un software para aplicaciones d escritorio k tb... as3 ya con una documentacion importante... todo lo q hacías ahora se hace de otra manera... etc etc etc...
Me recuerda al post sobre pq es tan chungo encontrar actionscripters decentes. En fin, suerte que esta el foro para ir preguntando y aportando algo cuando se puede. :P
Por cierto... apliquese lo mismo a css, htmls, phps..... y sus compis nuevos ruby's ajaxes etc...
Goio Telletxea
Yo uso las clases de Zeh Fernando, luego he probado con las de Laco, y me cascaba algo como lo de FuseKit pero a manola con funciones propias. Esto es un paso más adelante que lleva rodando algo de tiempo y que es justo lo que decís, un "must have" y un "time saver" de fruta madre...
Yo no lo he usado aún porque sigo con mis viejas costumbres que valen para la mayoría de proyectos sencillos, pero para cosas complejas tengo claro que lo voy a enganchar.
todavía puede llevarse más allá integrándolo en el Flash de los bemoles y que lo pueda usar cualquiera de modo que se democraticen de una vez las animaciones sin necesidad de ser un crack de AS... A mí cada vez que veo a alguien animando con frames me da un cargo de conciencia y un dolor que...
ozke
Yo de momento ya he hecho con fuse lo q hacía sin él, ahora intentaré sacarle jugo poco a poco :P
juandelgado
Yo estoy con msanchez.
Nunca habia utilizado Laco o Zigo o como se llamara. Y un dia me dio por hacer el Hello World de Fuse siguiendo un video tuto de GotoAndLearn, el que pone "Animating with Fuse". Y no fue muy dificil, a ver si saco tiempo y lo vuelvo a colar en algun proyecto.
Ea!
Usuario desconocido
Para empezar solo diré que Fuse es dios :mrgreen:
Lo que pasa es que lo estáis usando como los antiguos tweeners, y no le estáis sacando el jugo.
Una secuencia de tweens con fuse podría ser algo así:
<code>
ZigoEngine.register(Fuse, PennerEasing);
var f:Fuse = new Fuse();
f.push({x:50});
f.push({y:100});
f.push({rotation:180});
f.push({func:saluda, args:"hola", scope:this});
f.push({x:"-50", y:"100", alpha:50, scale:200});
f.target = miMovieClip;
f.addEventListener("onComplete", finFuse);
f.start();
function saluda(saludo:String):Void {
trace(saludo);
}
function finFuse():Void {
trace("Se terminó el fuse");
}
</code>
(Si algo no funciona es porque lo he escrito a saco sin probarlo...)
Aparte hay mil propiedades que tweenear, puedes tweenear varios targets al mismo tiempo, se pueden meter llamadas a funciones dentro de la secuencia, o comandos para pausar el fuse mientras se reproduce un sonido, y luego lo puedes resumir... no sé, en mi anterior trabajo usando AS2 era un "must have" y un "time saver" :mrgreen:
saludos
PD: Edito para añadir las llaves que se me habían olvidado, ya que al Fuse se le encolan objetos.
ozke
Jajaja, nose q numero de pag llevo yo pero había poca chicha. :P
hardface
Dale pinche cracker!!!!
:)
Ventd'Aval
sisi ^^