Comunidad de diseño web y desarrollo en internet

Carga de MovieClips desde bibliotecas externas

En el foro de ActionScript 3 se ven con cierta frecuencia preguntas relacionadas con cómo se pueden manipular elementos de las bibliotecas de los swf que cargamos. Intentaré que este tip sirva de respuesta.

En ActionScript 2 había que complicarse mucho la vida para poder acceder con soltura a la biblioteca del swf que cargábamos, pero en AS3, se vuelve mucho más sencillo, porque que todos los MovieClips que tenemos exportados para ActionScript están vinculados a una clase, y gracias a la propiedad contentLoaderInfo de la clase Loader (que usamos para cargar los swf). Esta propiedad devuelve un objeto del tipo LoaderInfo, que nos permite, por ejemplo, obtener los datos necesarios para crear una precarga en ActionScript 3. La clase LoaderInfo, tiene además una propiedad llamada applicationDomain, con la que (usando su método getDefinition) podemos acceder a las clases de ActionScript que ha usado el swf que hemos cargado.

Una vez llegados a este punto, tenemos que ver que hay diferentes formas en que los MovieClips de las bibliotecas están asociadas a sus clases. Pueden formarse clases auto-generadas, o podemos necesitar que la clase esté en un archivo .as externo, en el que podamos definir comportamientos específicos para ese clip.

Si las clases son auto-generadas...


No tenemos más que poner en práctica lo que acabamos de explicar. Si tenemos un archivo llamado cuadrado.swf en cuya biblioteca hay un clip disponible para exportar en Actionscript, con una clase auto-generada llamada llamada Cuadrado:

Código :

//Importamos las clases necesarias.
import flash.net.URLRequest;
import flash.display.*;
//Cargamos el archivo swf usando un Loader y un URLRequest
var req:URLRequest = new URLRequest ("cuadrado.swf");
var ldr:Loader = new Loader ();
ldr.load(req);
//Añadimos un listener que se ejecuta cuando se cargue el archivo
//Si le pedimos al swf sus clases de AS antes de que haya terminado de cargarse,
//evidentemente, no funcionará.
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeListener);
function completeListener(event:Event)
{
   //Al objeto LoaderInfo que acaba de disparar el evento (event.target) le pedimos la clase 
   //Cuadrado, que ya está auto-generada, y especificamos que la tome como una clase.
   var Cuadrado:Class = event.target.applicationDomain.getDefinition("Cuadrado") as Class;
   //No podemos tipar la variable (con ":Cuadrado") porque es una clase que cargaremos dinámicamnte,
   //después de compilar, y nos daría error.
   var cuadrado:* = new Cuadrado ();
   //Ahora ya podemos usar el objeto con total libertad, como si fuera un elemento de nuestro swf.
   addChild(cuadrado);
}


Si hemos definido la clase...


Si queremos importar un clip de una biblioteca externa, con su clase definida, por ejemplo así:

Código :

package 
{
   import flash.display.MovieClip;
   public class Cuadrado extends MovieClip
   {
      public function Cuadrado(str:String = "hallo")
      {
         trace(str);
      }
   }
}


Podemos proceder de 2 maneras:

Podemos usar el mismo código de arriba (cambiando var cuadrado:* = new Cuadrado (); por var cuadrado:* = new Cuadrado ("cualquier texto");) si hemos importado de verdad la clase Cuadrado.as al swf de la biblioteca. Para eso no es suficiente ni vincular el clip a la clase, ni simplemente poner un import Cuadrado; en un fotograma, ya que si no lo usamos, el compilador lo ignorará. Es necesario tener una instancia del clip en el escenario (además de en la biblioteca con la clase vinculada), o bien tipar una variable con la clase, así:

Código :

import Cuadado;
var importaLaClase : Cuadrado


La otra manera de proceder es importar la clase directamente en el swf que en que cargamos. Flash reconocerá que la misma clase está vinculada al símbolo de la biblioteca. Para eso no necesitamos meternos en el applycationDomain del swf, y podemos dejar el código así:

Código :

import flash.net.URLRequest;
import flash.display.*;
// ES IMPORTANTE NO OLVIDAR IMPORTAR LA CLASE
import Cuadrado;
var req:URLRequest = new URLRequest ("cuadrado.swf");
var ldr:Loader = new Loader ();
ldr.load(req);
//Igual sigue siendo necesario esperar a que se cargue para poder operar
// con los símbolos de su biblioteca
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeListener);
function completeListener(event:Event)
{
   var cuadrado:Cuadrado = new Cuadrado ("¡Aparece un cuadrado en el escenario!");
   addChild(cuadrado);
}

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate