Hace unos días me preguntaron como crear transiciones entre fotogramas en Flash. Esto es una tarea bastante sencilla de implementar así que aprovecho para explicarla en forma de Tip.
Lo que se pretende conseguir es que al cambiar de fotograma, los elementos del fotograma actual desaparezcan de forma animada antes de saltar al siguiente fotograma. Como se ve en el ejemplo:
Clicka en los botones de colores
Esta sencilla película está estructurada en varios fotogramas con un elemento diferente en cada uno de ellos y una serie de botones que nos hacen saltar de uno a otro.
La idea del ejemplo es que cada fotograma esté contenido en un MovieClip que contenga a su vez la animación de entrada y salida. Y por código haremos que se reproduzcan estas animaciones al cambiar de fotograma.
En el primer fotograma del MovieClip tendremos todo su contenido tal cual nos interese tener en pantalla, y apartir del segundo fotograma haremos la animación de entrada y salida.
Para este ejemplo la animación de entrada y salida será la misma interpolación de movimiento que reproduciremos adelante o hacia atrás según sea el caso.
Para poder referenciar el código colocaremos un Label "on" en el primer frame de la animación, un Label "anim" en los fotogramas internos de la animación, y un Label "out" en el último fotograma de la animación.
Ahora vayamos al código:
Empezaremos por la clase Main.as, que es la clase de la pelicula y donde asignaremos los comportamientos a los botones:
Código :
package {
import flash.display.MovieClip;
import flash.events.MouseEvent;
//
public class Main extends MovieClip {
public var currentFrameClip:MovieClip;
public function Main() {
this.boton1.addEventListener(MouseEvent.CLICK,gotoFrame);
this.boton2.addEventListener(MouseEvent.CLICK,gotoFrame);
this.boton3.addEventListener(MouseEvent.CLICK,gotoFrame);
this.boton4.addEventListener(MouseEvent.CLICK,gotoFrame);
this.stop();
}
private function gotoFrame(e:MouseEvent):void {
switch (e.currentTarget) {
case boton1 :
currentFrameClip.gotoFrame(1);
break;
case boton2 :
currentFrameClip.gotoFrame(2);
break;
case boton3 :
currentFrameClip.gotoFrame(3);
break;
case boton4 :
currentFrameClip.gotoFrame(4);
break;
}
}
}
}
Aquí lo único que hacemos es que los botones de la película hagan ejecutar al MovieClip, referenciado desde una variable "currentFrameClip", un método llamado "gotoFrame", que como su nombre indica nos hará saltar al fotograma pasado como parámetro.
Vayamos ahora a la clase que asignaremos a cada uno de los MovieClip de los fotogramas y que es la que hará reproducir la animación y saltar de fotograma:
Código :
package {
import flash.display.MovieClip;
import flash.events.Event;
//
public class FrameInOut extends MovieClip {
public var goto:uint;
public function FrameInOut() {
MovieClip(this.parent).currentFrameClip=this;
frameIntro();
}
public function gotoFrame(frame:uint):void {
if (frame!=MovieClip(this.parent).currentFrame) {
goto=frame;
this.gotoAndStop("on");
this.addEventListener(Event.ENTER_FRAME,avanzaFrame);
}
}
//-----------------------------------------------------
private function frameIntro():void {
this.gotoAndStop("out");
this.addEventListener(Event.ENTER_FRAME,retrocedeFrame);
}
private function retrocedeFrame(e:Event):void {
if (this.currentLabel=="on") {
this.removeEventListener(Event.ENTER_FRAME,retrocedeFrame);
} else {
this.prevFrame();
}
}
private function avanzaFrame(e:Event):void {
if (this.currentLabel=="out") {
this.removeEventListener(Event.ENTER_FRAME,avanzaFrame);
MovieClip(this.parent).gotoAndStop(goto);
} else {
this.nextFrame();
}
}
}
}
Esta clase lo que hace es guardar el valor del fotograma al que debe de saltar. Luego reproduce la animación de salida desplazandose desde el Label "on" al Label "out", y es entonces cuando llama ejecutar el gotoAndStop que hace cambiar de fotograma.
El contructor de la clase también tiene una llamada a una función que hace reproducir la animación de entrada creandose así la transición de un fotograma al otro.
Después de una charla con Eldervaz sobre la conveniencia del uso de enter_frames, decidió hacer una versión de su código para este tip.
Su propuesta consiste en eliminar las funciones de reproducción de la clase dejando ese trabajo a hacer por línea de tiempo desde el .FLA. Aquí muestro la clase resultante:
Código :
package
{
import flash.display.MovieClip;
import flash.events.Event;
//
public class FrameInOut extends MovieClip
{
public var goto:uint;
//
public function FrameInOut()
{
MovieClip(this.parent).currentFrameClip = this;
this.gotoAndPlay("out");
}
public function gotoFrame(frame:uint):void
{
if(frame != MovieClip(this.parent).currentFrame)
{
goto = frame;
this.addFrameScript(19, foo);
this.gotoAndPlay("anim");
}
}
private function foo():void
{
this.addFrameScript(19, null);
MovieClip(this.parent).gotoAndStop(goto);
}
}
}
Hay que puntualizar que siempre existen muchas maneras de conseguir el mismo objetivo y que una no es mejor que otra sino que depende de cuales sean nuestras necesidades. Lo importante de tip es aprender el concepto seguido y saber adaptarlo a nuestro caso.
A mi me encantan estos tips básicos. Muchas veces nos olvidamos que hay más gente aprendiendo que masters creando cosas. Sobre todo en el mundo de Actionscript 3 donde nos importan más las novedades über-cool que las tradicionales herramientas que desde AS2 nos han sido utiles, como estas transiciones.
Me gusta mucho tu iniciativa, Z. Mucho más el tip, tiene el nivel de complejidad justo para este tema en AS3. +1 Por:Freddie
Muy muy bueno , bien explicado, muchas gracias Zguillez......
Me doy... mañana salgo a comprar mi flash 9 con As3. Por:checheno
Buen aporte, y la verdad es un poco mas divertido el pensar como llegar a programar este tipo de cosas. Por:Deivtox
Totalmente de acuerdo con Freddie.
Otro buen tip Z, gracias por compartir Por:Manolito_BCN
Una consulta... Al armar una animación como la que dices, si en vez de usar cuadro de colores utilizo fotos obtengo los siguientes resultados en la memoria RAM:
-Cuando arranca, muestra la primer foto y el uso de memoria ram es de 9mb.
-Cuando hago click en el siguiente boton y muestra la segunda foto la memoria ram es de 10,5 mb.
-Cuando hago click en el tercero 11,5mb, y cuando hago click en el cuarto pasa a ser 12,5 mb...
Sin embargo si hago click en el primero de vuelta no aumenta porque ya tiene cargada la primera imagen... ¿conoce ud alguna forma de controlar bien la memoria RAM a gusto para no tener problemas de saturación (los hé tenido un par de veces)? Por:lucasmoyano
@Freddie no podía tener más la razón (esta vez) gracias por el tip Por:hCanté
=O he estado buscando esto mucho tiempo, que bien q no se olviden de los aprendices (como yo)... muy buen tip!! gracias, Z!!! Por:oxigeno
Excelente tip, que aunque parece simple a mas de uno nos ha dado dolores de cabeza y que sirve para muchas cosas.
Felicitaciones Por:bubudrc
Muchas muchísimas gracias, y... (todo lo demás que te he dicho en los demás medios)
lo que no entiendo es como hace uso de las clases desde el archivo fla, si no veo el import por ningún lado.Perdonen pero soy novatisimo en as3 jejejej. Por:currodelatajadera
Distriker :
Muchas muchísimas gracias, y... (todo lo demás que te he dicho en los demás medios)
lo que no entiendo es como hace uso de las clases desde el archivo fla, si no veo el import por ningún lado.Perdonen pero soy novatisimo en as3 jejejej.
La clase Main está asignada a la pelicula desde el panel de propiedades, y la clase del MovieClip se asigna en el menu de vinculacion desde la biblioteca Por:Zguillez
Como siempre excelente, gracias por el aporte. Por:piedra artificial-blog
Zguillez :
currodelatajadera-blog :
lo que no entiendo es como hace uso de las clases desde el archivo fla, si no veo el import por ningún lado.Perdonen pero soy novatisimo en as3 jejejej.
La clase Main está asignada a la pelicula desde el panel de propiedades, y la clase del MovieClip se asigna en el menu de vinculacion desde la biblioteca
Muchas gracias por preguntar Curro, y a ti ZGuillez por contestarlo, era algo que también me rondaba por la cabeza.
es correcto Z, el UPDATE es solo otra forma de hacerlo y podemos encontrar miles Por:eldervaz
Hola consulta como puedo hacer en Flash cs4, para que un boton copiado de la biblioteca, pueda agregarle la accion que al clickear pase de un Frame a Otro, me sale que no puedo agregar acciones en el evento.
Ni siquiera puedo agregar ON ( press ) para depues poner go to play Por:DANI1972-blog
Eso es porque el AS3 no permite código dentro de los elementos, mira, sería así:
muchas gracias x el tip.
pero tengo una duda.. el mc q carga al clicar en los botones, es siempre el mismo, lo que cambia es la "tinta". entonces si intento poner mc diferentes segun el fotograma.. m da error "TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
at FrameInOut/gotoFrame()
at Main/gotoFrame()"
haber si m puedes decir q tengo q modificar para q me funcione con diferentes mc.. m está dando muchos dolores d cabeza intentarlo sola.. stoy empezando con as3... muchisimas gracias!! Por:jut-blog
¿cuales son los elementos de un fotograma? Por:Nalle-blog
Zguillez,tengo curiosidad como novato que soy para saber como lo haceis vosotros, en relación a este tutorial de entradas y salidas,yo para liviar el peso,hacia lo siguiente:
En vez de hacer tantas capas, hacia swf externos,los cargaba en un loader, y luego hacia un cast de su contenido para usarlo como un tipico movieclip es decir:
MovieClip(swfexterno.contentLoaderInfo.content).gotoAndPlay("fotograma tal")
Salir , sale, pero es correcto? o es mejor transiciones entre fotogramas?
Espero que me entiendas jejejee Por:currodelatajadera