Clase para cargar contenido externo en Actionscript 3

January 14th, 2008 Posted in AS3, Class

Esta es una clase que tengo escrita para reutilizar y ahorrarme el tiempo de escribir el mismo código una y otra vez, se trata de una clase para cargar contenido externo.

La clase lo único que hace es cargar el contenido con un Loader y guardar una referencia. También dispara un evento cuando la carga se ha realizado para poder detectarlo desde fuera de la clase.

Esta es la clase:

package com.zguillez.display
{
    import flash.display.Sprite;
    import flash.display.Loader;
    import flash.net.URLRequest;
    import flash.events.Event;
    import flash.events.EventDispatcher;
    //-----------------------------------------
    public class Contenedor extends Sprite
    {
        public static  var CARGADO:String = "cargado";
        private var _clip:Sprite = new Sprite();
        private var _cargado:Boolean = false;
        private var _content:Sprite;
        private var _urlAsset:String;
        //-----------------------------------------
        public function Contenedor(asset:String=null)
        {
            _urlAsset = asset;
            if (_urlAsset != null) {
                iniLoad();
            }
        }
        //-----------------------------------------
        private function iniLoad(asset:String=null):void
        {
            var loader:Loader = new Loader();
            var request:URLRequest = new URLRequest(_urlAsset);
            loader.load(request);
            var dispatcher:EventDispatcher = loader.contentLoaderInfo;
            dispatcher.addEventListener(Event.INIT, registraContenido);
            addChild(loader);
        }
        //-----------------------------------------
        public function set asset(a:String):void
        {
            if (_urlAsset != null) {
                removeChild(_clip);
            }
            _urlAsset = a;
            iniLoad();
        }
        //-----------------------------------------
        public function get clip():Sprite
        {
            return _clip;
        }
        public function get cargado():Boolean
        {
            return _cargado;
        }
        //-----------------------------------------
        public function registraContenido(e:Event):void
        {
            _cargado = true;
            _clip = e.target.content;
            dispatchEvent(new Event(Contenedor.CARGADO));
        }
        //-----------------------------------------
    }
}

Su uso es muy simple:

import com.zguillez.display.Contenedor;

var cont:Contenedor = new Contenedor();
cont.asset = "pelicula.swf"

Y para detectar la carga completa:

cont.addEventListener(Contenedor.CARGADO, listo);
function listo(e:Event):void
{
    trace("carga lista")
}

Hay que decir que tambien tiene la posibilidad de cambiar el contenido simplemente asignándole otra ruta:

cont.asset = "pelicula2.swf"

Es una clase muy simple pero que me resulta útil y es fácilmente extendible para crear otras clases más complejas con preloads o lo que sea...
Espero que también les resulte útil ;)

Comparte:
  • Meneame
  • Twitter
  • Facebook
  • Google Bookmarks
  • del.icio.us
  • Technorati
  • email
  • Print

Post relacinonados:

  1. Clase de ActionScript 3 para retardar la ejecución de funciones
  2. Clase para dibujar líneas de puntos en ActionScript 3
  3. Clase de ActionScript 3 para añadir sombras a MovieClips
  4. Clase de Actionscript 3 para arrays multidimensionales
  5. Clase para transiciones de fotos

9 Responses to “Clase para cargar contenido externo en Actionscript 3”

  1. Rafeo Says:

    Muy buena clase Zguillez!! Bastante útil y práctica. Muchas gracias. (Y)


  2. Bleend Says:

    Ey! Esta muy bien! No sabría hacer yo la clase, pero entiendo su finalidad, y me parece algo bastante útil. U_U

    Mola (y)


  3. CODIGO.actionscript » Comunicación entre clases Actionscript 3 con EventDispatcher Says:

    [...] A raíz de una pregunta en un post anterior explicaré cómo detectar eventos personalizados entre clases de Actionscript 3. Para poder, por ejemplo, que una clase pueda detectar cuando otra clase a ejecutado una acción en concreto o ha completado una carga de datos externa. [...]


  4. Carolina Says:

    Zguillez! antes que nada muchas gracias por tu constante y valioso aporte.
    Estuve probando tu clase pero no logro q funcione, el swf externo nunca se vé (no me dá ningun mensaje de error). Constaté q esté bien especificado el paquete al q pertenece tanto en el frame del fla desde donde la llamo, como de la misma clase :( .
    Gracias!


  5. admin Says:

    @Carolina: Mira, te monté un .FLA de ejemplo para que veas como funciona:

    http://www.codigoactionscript.org/files/class-contenedor.zip


  6. Andrés Says:

    Muy buena !! ya la estoy usando, gracias ;)
    tengo un problema que no consigo solucionar, y es que no encuentro cómo poner un controlador de error para el caso en el que la url está mal.
    Si se le pasa una url correcta funciona de maravilla, pero si le paso una url incorrecta salta la ventana de error :

    Error al abrir la URL 'http://www.cualquiercosa.com/foto.jpg'
    Error #2044: IOErrorEvent no controlado: text=Error #2035: No se encuentra la dirección URL.

    si el usuario tiene flash instalado va a ver la ventana de error y eso es lo que no quiero que pase. Retoqué un poco tu clase intentando agregar el controlador de errores que vi en la documentación de adobe, agregué lo siguiente en la linea 13:
    import flash.events.IOErrorEvent;

    y lo siguiente en la linea 42:
    dispatcher.addEventListener(IOErrorEvent.IO_ERROR, f_errorLoading);

    y abajo del todo la funcion :
    public function f_errorLoading(event:IOErrorEvent):void {
    trace("error controlado, no encuentra la url.");
    }
    pero me sigue dando el mismo error. ¿tienes idea cómo se puede arreglar eso?
    Muchas gracias !


  7. Martin Says:

    Que tal, tengo el mismo error:
    ...Error #2035: No se encuentra la dirección URL ...

    Localmente funciona normal, pero al abrir la URL... me manda el error. Gracias


  8. Daniel Says:

    Hola. Gracias por la clase, tengo un pequeño problema, dices que se puede cambiar el contenido simplemente cambiando el asset. Pues bien, he añadido este código al .fla que ha dejado en los comentarios:

    setInterval(cambia,5000);
    function cambia()
    {
    _contenedor.asset = "contenedor2.swf";
    }

    y cuando pasan los 5 segundos, me devuelve este error:

    ArgumentError: Error #2025: El objeto DisplayObject proporcionado debe ser un elemento secundario del llamador.
    at flash.display::DisplayObjectContainer/removeChild()
    at com.zguillez.display::Contenedor/set asset()
    at contenedor_fla::MainTimeline/cambia()
    at Function/http://adobe.com/AS3/2006/builtin::apply()
    at SetIntervalTimer/onTimer()
    at flash.utils::Timer/_timerDispatch()
    at flash.utils::Timer/tick()

    Como puedo cambiar el contenido del contenedor?

    Muchas gracias.


  9. misha Says:

    Hola.

    una pregunta, se puede usar los objetos de libreria del swf cargado dentro de flex ?

    si se puede como se hacen?

    Gracias


Leave a Reply