Clase para cargar contenido externo en Actionscript 3

Posted by admin | AS3, Class | Monday 14 January 2008 1:45 pm

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

10 Comments »

  1. Comment by Rafeo — 30 November, 1999 @ 12:00 am

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

  2. Comment by Bleend — 30 November, 1999 @ 12:00 am

    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. Pingback by CODIGO.actionscript » Comunicación entre clases Actionscript 3 con EventDispatcher — 30 November, 1999 @ 12:00 am

    [...] 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. Comment by Carolina — 5 November, 2008 @ 10:00 pm

    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. Comment by admin — 14 November, 2008 @ 11:57 am

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

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

  6. Comment by Andrés — 12 December, 2008 @ 12:54 pm

    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. Comment by Martin — 22 January, 2009 @ 9:11 pm

    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. Comment by Daniel — 29 December, 2009 @ 2:40 pm

    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. Comment by misha — 4 February, 2010 @ 5:54 am

    Hola.

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

    si se puede como se hacen?

    Gracias

  10. Comment by adriana — 8 May, 2010 @ 11:12 am

    hola,estoy haciendo un proyecto grande, que tiene varias peliculas.swf, una llama a otra y ésta a otra...etc.., el caso q todo me funcionaba bien y cargaba el swf de cada una poniendole en cada pelicula una variable de tipo loader, lo q pasa q la navegacion al principio va bien y luego se relentiza(se nota xq la anima va mas despacio), luego me dí cuenta q podia relentizarse, porque se crean muchas variables loader pero no se eliminan se quedan ahi... y os encontré aqui, una clase, con un unico loader a cada una de mis peliculas sin tener que crear loader en cada una de ellas, el caso q quiero saber, porque de clases no ando muy bien, como borro en la que estoy, una vez q pulso xa ver una nueva pelicula... me fijado q la clase lleva una funcion de borra() q es _urlAsset=null
    gracias.

RSS feed for comments on this post. TrackBack URI

Leave a comment

Get Adobe Flash playerPlugin by wpburn.com wordpress themes