LLops Blog

Blog de programación creativa mantenido por llops. Experimentos y artículos entorno a la plataforma flash y as3.

Clase FrameScript

La clase MovieClip de AS3 tiene un método indocumentado llamado addFrameScript. Este método nos permite asociar una función a un número de frame. Esto significa que gracias a él podemos tener código en un punto concreto de nuestro timeline sin necesidad de codificar en Flash.

Su firma es:

  1. public function addFrameScript(frame:int, func:Function):void;

 

Pero... ¿por qué existe este método?

Si utilizamos un movieClip que tenga código en alguno de sus frames o más de un frame (sino sería compatible con Sprite) y éste cuenta con una clase asociada, si la clase no extiende de MovieClip, el compilador arroja el siguiente error:

1180: Call to a possibly undefined method addFrameScript.

En el artículo Programando en AS3 desde Flash CS3 (I) vimos que, en AS3, todo lo que hacíamos en el IDE de Flash acababa "transformándose" en clases.

Pues bien, addFrameScript es la forma que tiene el compilador para coger el código que tenemos dispersado en nuestros movieclips y añadirlo a nuestra clase. De ahí que si se dan las condiciones que hemos visto, el compilador nos muestra ese error, ya que intenta buscar un método addFrameScript en una clase que no lo define.

 

Sacando partido de addFrameScript

Utilizando esta función indocumentada y la nueva clase de AS3 FrameLabel, escribí hace algún tiempo una sencilla clase que nos permite añadir y eliminar código en un frame que contenga una o más etiquetas. La clase se llama FrameScript.

Para instanciar una nueva clase FrameScript debemos pasar un MovieClip en el constructor.

  1. public function FrameScript(mc:MovieClip);

Una vez creada, disponemos de dos métodos públicos:

  1. // Asocia una función en el frame que marca la etiqueta
  2. public function addScript(value:String, func:Function):void
  3. // Elimina la función asociada a la etiqueta
  4. public function removeScript(value:String):void

Utilizar etiquetas en vez del número del frame es mucho más intuitivo y permite modificar la longitud del timeline sin que nuestro código falle.

 

Algunas formas de utilizar FrameScript:

Como variable de clase en caso que tengamos que acceder más de una vez a nuestra instancia:

  1. // Variable de clase
  2. private var fs:FrameScript;
  3. // Constructor o metodo
  4. fs = new FrameScript(mc);
  5. fs.addScript("labelFin", finAnimacion);
  6. // Metodo
  7. private function finAnimacion():void
  8. {
  9.     mc.alpha = 0;
  10.     fs.removeScript("labelFin");
  11. }

Como variable local en caso que tengamos que acceder una única vez para asociar código:

  1. // Variable de funcion
  2. var fs:FrameScript = new FrameScript(mc);
  3. fs.addScript("labelFin", finAnimacion);
  4. // Función dentro de método
  5. function finAnimacion():void
  6. {
  7.     mc.alpha = 0;
  8. }

Sin asignar variable (forma breve):

  1. // Forma breve
  2. new FrameScript(mc).addScript("labelFin", function():void { mc.alpha = 0 });

Y un ejemplo muy simple para ilustrar su uso: dos instancias de un mismo movieclip cuyo comportamiento es modificado al marcar el check.

pNecesitas el Flash Player 9.0.28 para ver esta película

Descargar ejemplo

 

Algunas consideraciones

Gracias a este método podemos mantener todo el código encapsulado en nuestra clase sin necesidad de programar en la linea de tiempo. Incluso podemos añadir nuevas funcionalidades en tiempo de ejecución, no sólo de compilación.

Aunque en líneas generales es una buena práctica no tener el código "escampado" por el fla, el otro extremo puede ser igual de malo. Es más sencillo tener algunos frames con instrucciones sencillas tipo stop() que intentar sacar todo el código fuera.

Por otro lado, la mayoría de veces que un programador necesita meter código en un movieclip suele ser para sincronizar las animaciones. En estos casos sí que puede ser más conveniente utilizar FrameScript antes que tener un bloque de código similar  a esto:

MovieClip(parent).stop();
MovieClip(parent).proyectil.visible = false;
MovieClip(parent.parent).finAnimacion();

Por último, addFrameScript es un método indocumentado. Esto significa que Adobe no garantiza que en futuras versiones del Flash Player se soporte, y en ese caso nuestras películas fallarían. De todas formas, es muy improbable que suceda algo así y nunca he visto que se haya dado este problema con otros métodos indocumentados.

 

>> Descargar la clase FrameScript

Post publicado el 16 de February de 2008 a las 20:20 por llops

Categorias: Utilidades

Etiquetas: , , ,

¿Quieres seguir los comentarios de esta entrada? RSS 2.0

Permalink, Trackback

3 comentarios

  1. #1   luis

    pues chido tutorial, y un bravo por este tipo de paginas constructivas!

  2. #2   Rafeo

    Órale, no sabía de esta clase! Gracias Llops!

  3. #3   Marito_jeje

    Excelente¡¡ muy util y práctico, gracias por postear estos tips, estaremos pendientes de nuevos post. :)

¡Deja un comentario!

Recuerda:

  • Los lectores de este blog son gente maja y sensible, así que pórtate bien y se respetuoso con tus comentarios.
  • Puedes usar las siguientes etiquetas html: <b>, <em> y <a>.
  • Si deseas añadir código utiliza este formato: [as3]code[/as3].
Top