Cristalab

Carga de MovieClips desde bibliotecas externas

Por: Zah + 20.02.2008

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);
}

Etiquetas actionscript_3

Comentarios | Enviar un comentario
Completamente útil. Gracias
Por: JoH
Buenísimo...
Absolutamente excelente, bravo
Por: adriesp_blog
Buen código. Me fue útil Thumbs up
thanks miau
Por: Zguillez
¡Muy bueno, Zah!
Por: The Fricky!
no entiendo ni m. chesumela :/ quiciera entenderlo todo.
Por: little kernel_blog
a mi me da un ReferenceError: Error #1065: No se ha definido la variable Boton.
at flash.system::ApplicationDomain/getDefinition()
at cargaboton_fla::MainTimeline/completeListener()

Alguien sabría decirme el porque????
Por: arwen_blog
Ya está, es que no había vinculado el movieClip del swf (que torpeza)
Muy buen tutorial, felicitaciones!!!!
Guiño
Por: arwen_blog
U_U muy bueno, felicidades miau
Por: eldervaz
Gracias, si todos los artículos fueran así de directos y sin tanto rollo, sno con ejemplos directos como los usas. La capacitación sería otra cosa. Felicitaciones
Por: JM_blog
aja y que hace esta vaina?
Por: el poet_blog
Es importante que tengan interes de copartir sus conocimientos con nosotros. son excelentes sus tips
Por: Eni_blog
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.