Error al cargar un flash (swf) en AS3 dentro de otro

Error al cargar un flash (SWF) en AS3 dentro de otro

30 de marzo 2011

Hace ya algún tiempo, decidí empezar a hacer proyectos flash con ActionScript 3 (AS3), ya que me permitía hacer cosas que con ActionScript 2 (AS2) no podía.

Desde un primer momento tuve ciertos problemas para adaptarme al nuevo lenguaje de programación, pero con los textos de ayuda del programa y un poco de búsqueda por internet los iba solventando sin mayores inconvenientes. Así pues, pude realizar varios SWF que funcionaban bien por separado y que pensaba cargarlos dentro de otro archivo que sería el principal.

Después de saber que el artículo al que hacía referencia en este post ya no se encontraba online, lo he actualizado añadiendo directamente una de las soluciones al problema.14 julio 2016


Como recordaréis, hacerlo en AS2 era bastante sencillo de programar, creábamos un movie clip vacío que colocábamos en el escenario con un nombre y luego se usaba el comando loadMovie para cargar el archivo en cuestión. Era algo como:

capa_carga.loadMovie("archivo_externo.swf");

Pero en AS3 esto ya no funciona así, sino que tendremos que hacerlo mediante a creación de una instancia de la nueva clase Loader y después atribuirle la ruta del archivo.

var mi_flash = new Loader();
mi_flash.load(new URLRequest("archivo_externo.swf"));
addChildAt(mi_flash, 0);

Hasta aquí todo correcto, sin embargo el problema nos llega cuando Flash nos lanza el error «TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo». Justamente es en esta cuestión de cargar un archivo externo dentro de otro es donde se me fue la vida y un poco desesperado ya porque no encontraba documentación al respecto, me topé con la siguiente solución en un blog que hizo que conciliara el sueño de nuevo.

Es bastante común encabezar nuestros archivos SWF con un poco de ActionScript que nos permita controlar si la película se verá a pantalla completa o si se escalará el contenido. Algo como lo siguiente:

stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;

Pues bien, cuando cargamos una película flash que contiene este tipo de instrucciones para el constructor dentro de otra en AS3, es cuando la aplicación nos muestra el error anterior.

Sin quedarme muy claro si se trata de un bug o de la nueva arquitectura del lenguaje, la solución al problema es verificar si la propiedad stage está disponible, metiendo las órdenes dentro de un condicional por ejemplo.

if (stage){
   stage.align = StageAlign.TOP_LEFT;
   stage.scaleMode = StageScaleMode.NO_SCALE;
}

Por desgracia el artículo original de Mark Ledford ya no se encuentra online, pero puedes visitar el artículo «Why some AS3 swfs work stand alone but fail to load into other swfs» archivado en Wayback Machine, donde se comentan también otras posibles soluciones.

Si quieres conocer más sobre cómo funcionan los métodos anteriores y los parámetros que podemos configurar en cada uno, puedes hacerlo en el artículo oficial sobre la Carga de archivos SWF externos en otro SWF que proporciona Adobe.

Publicado por Jesús Tovar

Categorías: Flash, Programación

Etiquetas: ,

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Desliza para verificar