Comunidad de diseño web y desarrollo en internet online

El reemplazo a attachMovie en Actionscript 3

En la tercera versión ActionScript (AS3) nos encontramos con que muchas de las funciones a las que estábamos acostumbrados ya no están o han cambiado. Una de ellas es el attachMovie. Para quien no lo sepa, el attachMovie te permitía traer elementos de la biblioteca de tu SWF (previamente exportados con un "id") en tiempo de ejecución al escenario. Lo que daba la posibilidad de cargar objetos pasándole como argumento una variable. Por ejemplo :

Código :

var linkageName:String = "clip";
_root.attachMovie(linkageName, "nuevoNombre", 42);

"clip" es un objeto de la biblioteca con ese nombre de exportación

En AS3, el sustituto natural es addChild, el cual requiere un objeto instanciado de una clase, y es más, ahora al exportar en la biblioteca no le damos un "id", sino una clase (Class), por lo que ya no podemos pasarle una variable a un constructor. Esto NO funcionaría :

Código :

var linkageName:String = "objetoExportado";
var objetoInstanciado:Object = new linkageName();


Para solucionar esto tenemos el método getDefinitionByName() (del paquete flash.utils). El nuevo código quedaría así :

Código :

import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.utils.getDefinitionByName;

var ClassReference:Class = getDefinitionByName("objetoExportado") as Class;
var instance:Object = new ClassReference();
addChild(DisplayObject(instance));

"objetoExportado" es un objeto de la biblioteca exportado con esa clase

Ahora nos surge un problema, y es que en AS2 podíamos hacer un attachMovie a un objeto de un SWF cargado dinámicamente, por ejemplo :

Código :

_root.contenedor.loadMovie("objetos.swf");
function test() {
clearInterval(idset);
_root.contenedor.attachMovie("objetoExportado","nuevoNombre",666); 
};
//El setInterval sólo es para esperar a que cargue el objetos.swf
// En local la carga es casi instantánea y 3 segundos es más que suficiente, 
// en la web deberías de esperar a que se cargase al 100% con métodos como el MovieClipLoader
idset = setInterval(test,3000);

"objetoExportado" es un objeto de la biblioteca con ese nombre de exportación que está en objetos.swf. Desde OTRO swf cargamos objetos.swf

Si probamos el código anterior de AS3, nos dará como resultado que la variable "objetoExportado" no está definida, y es que getDefinitionByName, sólo funciona cuando el objeto exportado está en el mismo SWF. Para solucionar esto, tenemos que usar getDefinition (la cual ya no es un método del paquete flash.utils, si no que se pierde entre las propiedades y métodos de los loaders, displaysObjects y demas)

Código :

import flash.display.*;
import flash.net.URLRequest;
var ldr:Loader = new Loader();
var url:String = "objetos.swf";
var urlReq:URLRequest = new URLRequest(url);
ldr.load(urlReq);
addChild(ldr);

function prueba(){
clearInterval(idset);
var clase:Class = ldr.contentLoaderInfo.applicationDomain.getDefinition("objetoExportado") as Class;
var mc = new clase();
this.addChild(mc);
}
// el setInterval vuelve a ser para asegurarse de que el objetos.swf está cargado 
//En local funciona, en la web habría que esperarse a que cargara al 100% por otros métodos.
idset = setInterval(prueba,3000);

"objetoExportado" es un objeto de la biblioteca exportado con esa clase que está en objetos.swf. Desde OTRO swf cargamos objetos.swf

Espero que les sea útil.

¿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