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

Por adriesp el 20 de Febrero de 2008
Absolutamente excelente, bravo
thanks
Por little kernel el 21 de Febrero de 2008
Por arwen el 22 de Febrero de 2008
at flash.system::ApplicationDomain/getDefinition()
at cargaboton_fla::MainTimeline/completeListener()
Alguien sabría decirme el porque????
Por arwen el 22 de Febrero de 2008
Muy buen tutorial, felicitaciones!!!!
Por JM el 25 de Febrero de 2008
Por el poet el 28 de Febrero de 2008
Por Eni el 12 de Marzo de 2008
Por Cianya el 01 de Julio de 2008
Yo utilice este código para cargar un swf externo a mi pelicula principal:
var request1:URLRequest = new URLRequest("audio.swf");
var loader:Loader = new Loader();
loader.load(request1);
addChild(loader);
La carga fue todo un éxito. Pero ahora necesito saber como hacer para descargarlo, es decir deseo que al final de que se ejecuta la pelicula principal este swf externo desaparezca, que se descargue.
Intento con este codigo pero me envia error:
stop();
//
function clickHandler2(event:MouseEvent):void {
trace("CLICK");
var request1:URLRequest = event.currentTarget as URLRequest;
var loader:Loader = new Loader();
loader.unload();
removeChild(loader);
gotoAndPlay(2,"Scene 1");
}
//var aButton:Button = new Button();
bButton_btn.addEventListener(MouseEvent.CLICK,clickHandler2);
Gracias por su ayuda de antemano =D
Por eChicho el 23 de Diciembre de 2008
Saludos,
Por bakCode el 29 de Abril de 2010
Por bakCode el 29 de Abril de 2010
Por hmvr414 el 30 de Agosto de 2011