Estos dias he estado probando el Adobe Creative Suite CS3 y en particular el Flash CS3, y una de las cosas que de entrada me ha llamado más la atención es la exportación de animaciones a código XML.
Con este sistema podemos hacer animaciones "a mano" por línea de tiempo para luego exportarlas a código y poder reutilizarlas en películas más complejas. Esta animación en formato XML la podremos aplicar a diferentes MovieClips o editar los nodos del XML para modificar los parámetros de la animación. Así que las posibilidades son amplias.
Veamos un ejemplo:
El primer paso será abrir un documento nuevo y crear una animación simple, a través de una interpolación. Utilizaremos la nueva herramienta "Rectangle Primitive" y dibujaremos un rectángulo en el lienzo.
Este rectángulo lo convertiremos a símbolo y crearemos una animación con unos cuantos fotogramas clave que hagan cambiar la escala del símbolo (para ver el ejemplo no vale la pena complicarse mucho).
Esta sería la animación:
Ahora seleccionaremos todos los fotogramas de la interpolación y seleccionaremos con el botón derecho: "Copy Motion as ActionScript 3"
Nos pedirá que añadamos el nombre del MovieClip que estamos utilizando. Podemos poner cualquier cosa, por ejemplo "boton".
Esta acción nos copiará en el portapapeles el siguiente código:
var boton_animator:Animator = new Animator(boton_xml, boton); boton_animator.play();
Como podemos ver, nos ha creado un objeto XML que contiene todos los parámetros de la animación realizada.
La clase "Animator" es la que crea la animación pasándole como parámetros el objeto XML y el clip que queremos mover. Iniciaremos la animación con la función play();
Código :
import fl.motion.Animator; var boton_xml:XML = .................
var boton_animator:Animator = new Animator(boton_xml, boton); boton_animator.play();
Si colocasemos este código en una película nueva, en un fotograma con un MovieClip que se llamase "boton" veríamos que se reproduciría exactamente la misma animación.
Ahora veamos como reutilizar este código de una manera más útil:
Primero copiaremos el codigo XML dentro de un archivo de texto. Pero SOLO el código XML, eliminando el código ActionScript:
Este archivo de texto lo llamaremos "animacion_boton.xml".
Empezaremos a crear nuestra pelicula en Flash. Simplemente haremos una parrilla de botones que tengan todos esta animacion al hacer rollOver.
Crearemos un nuevo archivo de ActionScript, y crearemos nuestra class principal. La llamaremos "Main".
Cómo es la clase principal deberá extender de MovieClip, y además necesitaremos añadir los siguientes paquetes:
flash.net.* - Para cagar el archivo XML
flash.xml.* - Para poder manejar el XML
flash.events.Event; - Para controlar la carga del fichero
También importaremos la clase "botonSimpleAnimado" que es una clase que escribiremos a continuación y que será la que dibuje el botón y lo anime.
Código :
package { import flash.display.MovieClip; import flash.events.Event; import flash.net.URLLoader; import flash.net.URLRequest; import flash.xml.XMLDocument; import flash.xml.XMLNode; import botonSimpleAnimado; //--------------------------------------- public class Main extends MovieClip { //--------------------------------------- public function Main() { } } }
En el constructor de la clase cargaremos el archivo XML, y ejecutaremos una acción cuando el archivo esté cargado del todo:
Código :
private var _botones_list:Array = new Array(); private var _animacion_xml:XMLDocument = new XMLDocument; //--------------------------------------- public function Main() { var url:URLRequest = new URLRequest ("animacion_boton.xml"); var loadUrl:URLLoader = new URLLoader (url); loadUrl.load(url); loadUrl.addEventListener(Event.COMPLETE, xnComplete); function xnComplete(event : Event):void { _animacion_xml.ignoreWhite = true; _animacion_xml.parseXML(loadUrl.data); // iniBotonera(); } }
La función "iniBotonera" nos colocará los botones en la pelicula. Los botones serán instancias de la clase "botonSimpleAnimado" que escribiremos a continuación. Colocaremos una parrilla de botones de 5 columnas y 4 líneas:
Código :
private var _botones_list:Array = new Array(); private var _numX:int = 5; private var _numY:int = 4; private var _animacion_xml:XMLDocument = new XMLDocument; //--------------------------------------- public function Main() { var url:URLRequest = new URLRequest ("animacion_boton.xml"); var loadUrl:URLLoader = new URLLoader (url); loadUrl.load(url); loadUrl.addEventListener(Event.COMPLETE, xnComplete); function xnComplete(event : Event):void { _animacion_xml.ignoreWhite = true; _animacion_xml.parseXML(loadUrl.data); // iniBotonera(); } } //--------------------------------------- private function iniBotonera():void { var X:int = 10; var Y:int = 10; for (var i:int=1; i<=_numY; i++) { for (var ii:int=1; ii<=_numX; ii++) { //crea el boton var boton:botonSimpleAnimado = new botonSimpleAnimado(this, X, Y, _animacion_xml); _botones_list.push(boton); // X += 110; } X = 10; Y += 40; } }
Esta clase ya está terminada, podemos ver el código completo. La guardaremos en un archivo que se llame "Main.as".
Ahora escribiremos la clase "botonSimpleAnimado".
Esta clase la extenderemos de la clase "botonSimple". Para esta clase utilizaremos una clase creada en otro tip que escribí hace un tiempo:
Esta clase lo que hace es colocar un botón simple dentro de nuestra película.
A esta clase ya creada necesitaremos realizarle la siguiente modificación: Dejaremos el constructor vacío y pasaremos el código a una función publica (este paso es necesario para poder extender de ella). Tambié haremos que esta función devuelva como parámetro una referencia de la instáncia de la clase "SimpleButton" creada. La clase quedaría asi:
Código :
package { import flash.display.Sprite; import flash.display.SimpleButton; //---------------------------- public class botonSimple extends Sprite { private var ruta:Sprite; private var boton:SimpleButton = new SimpleButton; //---------------------------- public function botonSimple() { } public function creaBotonSimple(queRuta,queX,queY):SimpleButton { ruta = queRuta; boton.upState = creaSprite(3,0x000000,0xFF9900,100,30); boton.overState = creaSprite(3,0x000000,0xFFCC00,100,30); boton.downState = creaSprite(3,0x000000,0xFFCC99,100,30); boton.hitTestState = boton.upState; boton.useHandCursor = true; boton.x = queX ; boton.y = queY; ruta.addChild(boton); return boton } //---------------------------- private function creaSprite(lin_grosor, lin_color, relleno_color, ancho, alto):Sprite { var sprite:Sprite = new Sprite(); sprite.graphics.lineStyle(lin_grosor, lin_color); sprite.graphics.beginFill(relleno_color); sprite.graphics.drawRect(0, 0, ancho, alto); return sprite; } } }
Sigamos con la clase "botonSimpleAnimado".
El constructor de esta clase colocará una instancia de la clase "botonSimple" en la posición X y Y recibida como parámetro desde el bucle generado en la clase "Main".
También recibirá como parámetro de la clase "Main" el código XML que contiene la animación. aquí será entonces donde aplicaremos la animación al botón.
Además añadiremos un detector de eventos para ejecutar la animación cuando hagamos rollOver sobre el botón.
La clase quedaría así:
Código :
package { import flash.display.MovieClip; import flash.display.SimpleButton; import flash.events.Event; import flash.events.MouseEvent; import fl.motion.Animator; import flash.xml.XMLDocument; import flash.xml.XMLNode; import flash.xml.XMLNodeType; //---------------------------- public class botonSimpleAnimado extends botonSimple { private var _animacion:Animator; private var _animacion_xml:XMLDocument = new XMLDocument; private var _ruta:MovieClip; //---------------------------- public function botonSimpleAnimado(queRuta,queX,queY,queXML) { _ruta = queRuta; var boton:SimpleButton = creaBotonSimple(queRuta,queX,queY); // //anima el boton _animacion_xml = queXML; var animacion_xml:XML = new XML(_animacion_xml.firstChild); _animacion = new Animator(animacion_xml, boton); // //eventos del boton boton.addEventListener(MouseEvent.MOUSE_OVER, xnRollOver); function xnRollOver(event:Event):void { _ruta.setChildIndex(boton, _ruta.numChildren - 1); _animacion.play(); } } } }
Listo! Una vez acabadas las clases abriremos un nuevo documento de Flash y le asignaremos la clase "Main" cómo clase principal.
Solo queda publicar y ver el resultado:
Ahora podríamos sustituir el XML por otro y cambiar fácilmente el efecto del botón o asignar una animación diferente para cada botón o para los diferentes estados...
Personalmente considero que es una de las mejores características de Flash CS3. Gracias por el Tutorial, Zguillez, muy original y sencillo. Por:Jorge Díaz_blog
Muy buena la caracteristica... Habra que meterle mano ya mismo al CS3...
Gracias por el tuto. Por:Huge_blog
Interesante opción, esto lo que nos ahorra tiempo
tomo nota... Por:Suriv
me sigue acojonando el as3...
ay omá! Por:deltorno_blog
Madre mia! Pero todo eso para hacer una mierda de rollover en un botón! Están flipando si creen que vamos a hacer toda una web así!
Donde está la ventaja? Por:Sonny Crockett_blog
Sonny Crockett_blog :
Madre mia! Pero todo eso para hacer una mierda de rollover en un botón!
Si te fijas, el titulo del Tip es: "Exportar animaciones como código AS" NO "Cómo hacer un rollover en un botón"... Lo interesante del tema es ver que se puede generar una animación por código y aplicarlo a lo que sea, editarlo, reutilizarlo, o lo que se te ocurra. El ejemplo del rollover es eso, un ejemplo. Por:Zguillez
Excelente!
Ya me muero de ansias por descargarlo y trastearlo.
Sonny Crockett..... ¿de verdad no ves las ventajas?
Tal vez no has entendido nada, si hablas de 1 proyecto solamente, por supuesto que no tendría sentido hacer todo éso, pero que tal si tienes 10 proyectos y puedes aplicar el mismo efecto en 4 de ellos, entonces si que sería una gran ventaja seguir todos los pasos, de ésa forma irás formándo tu propia librería de efectos que podrás reutilizar en cuanto proyecto te venga en gana con un mínimo de esfuerzo. Por:La100rra
Es genial. De ahora en mas se pueden hacer MC a partir de codigo. Tendria mucha utitlidad para una galeria o algo asi almacenado en una base de datos. Ya hace tiempo que el flash dejo de ser una herramienta de dibujo y animacion solamente, estos cambios son nesesarios. Por:NandoNet_blog
Vaya, pues sí que es sencillo... seguro que me ahorrará un montón de tiempo Por:Zah
En verdad que es un articulo interesante...la verdad que estas novedades de flash nos van a ahorrar mucho el trabajo y se podrán construir cosas muy increibles....gracias por el articulo... Por:croft__blog
Felicitaciones buen articulo, esto ayudara bastante a los equipos de desarrollo. Pero es demasiado fácil para creer que podrías hacer cosas muy increibles.
Ojala adobe tenga una visión de las consecuencias que esta opción traera. Por:creo
Sigo pensando que algo que nacio para facilitar la existencia a los diseñadores, y que era una manera sencilla de programar como era As, se esta complicando demasiado.
Pero todo sea por el futuro.
yo seguire dandole caña a crear 1 instancia de algo y arrasar con duplicatemovieclip... Por:menudolio_blog
Tanto codigo para eso no joda que asco pero esta buena la intenciòn Por:Danny_blog
Danny_blog :
Tanto codigo para eso no joda que asco pero esta buena la intenciòn
La comprensión de lectura es una habilidad olvidada en la educación de hoy. Que triste. Por:Freddie
ZGuillez, creo que tendríamos que hacer un recopilatorio con tus "trucos" para AS3, para tenerlos todos juntos. Buen trabajo. Por:Sisco
Entiendo perfectamente a los diseñadores que no saben mucho de programación y se le hace mucho codigo, yo como informatico se que tiene muchas ventajas, sobre todo si llevaste 800 horas de clases de programación, pero si eres diseñador y llevaste 800 horas de diseño, ilustración, embalajes y metodos de impresión y ves este tutorial, pues si, es mucho codigo y muy raro...
De mi parte, muchas gracias!! ya quiero tener el CS3 Por:alfge_blog
Cada dia los tutoriales son mejores y super ilustrativos, pero este es una joya!!! Mil gracias por tu trabajo, como diseñadora valoro mucho todas tus notas, gracias!! Por:Ancolmi_blog
>>>Freddie: La comprensión de lectura es una habilidad olvidada en la educación de hoy. Que triste.
No es la comprensión de lectura, tener menos codigo es ahorro de tiempo en teclearlo. Además yo sigo sin ver las ventajas, esto se puede hacer facilmente en flash 8, y si quieres agregar el mismo efecto a otro movieclip solo basta con cambiar el objeto dentro del movieclip Por:Eder_blog
Eder_blog :
esto se puede hacer facilmente en flash 8
Esto es imposible de hacer en Flash 8 porque precisamente es una de las caracteristicas más llamativas de CS3.
Te asustaste por la cantidad de código y no leíste realmente que es. Creeme, el código y su extensión es lo de menos y más irrelevante. Lee. Por:Freddie
muchas gracias, que ganas ed pillarme el nuevo flash! Por:eva_blog