Post Escrito

compartir

Cargar SWF o JPG externos con ActionScript 3 View Comments

Jun26

Siguiendo con los tutoriales básico de ActionScript 3, me pareció interesante mostrarles como cargar un SWF externo en AS3.
Un recurso muy utilizado a la hora de armar una página o una aplicación en Flash.

El proceso a seguir es medianamente similar a lo que era usar MovieClipLoader en ActionScript 2, pero obviamente cambiando la sintaxis.
Lo bueno que tiene AS3 es que todo se maneja de manera similar a través de los Listeners, por lo que hace la programación bastante intuitiva a la hora de empezar si uno no conoce todos los elementos que AS3 nos da para trabajar.

Bien comencemos…

La clase que se utiliza en AS3 para cargar tanto SWF como JPG externos, es la clase Loader que está en el paquete flash.display.
Lo primero que hay q hacer es instanciar esta clase. Obviamente si la usamos en una clase personal hay que importar la clase de la siguiente manera (desde el código de un fla no hace falta):

[as]import flash.display.Loader;[/as]

una vez importada la clase pasamos a generar la instancia y los Listeners necesarios para manejar nuestra carga externa.

[as]var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.OPEN, onOpen);
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);[/as]

Es importante destacar que los Listenes no se le agregan al loader, sino al contenidos del mismo… para saber cuándo se abrió, cuando se está cargando y cuando se termina de cargar el contenido. Por eso se escribe el contentLoaderInfo.
Esa es una de las diferencias con el URLLoader (además de que el mismo se usa para cargar datos y no JPG o SWF).
También es importante aclarar que se podría agregar otro Listener con el Event.INIT, que lo que hace es “escuchar” cuando la película se comienza a iniciar.

Lo siguiente a hacer es indicarle que queremos cargar a nuestro objeto Loader. Lo hacemos de la siguiente manera:

[as]loader.load(new URLRequest(“peliculaExterna.swf”));[/as]

Usamos URLRequest para indicar que swf o jpg queremos cargar. Para ellos si estamos creando una clase deberiamos importar la clase URLRequest, que esta en el paquete flash.net.URLRequest
Lo último que nos quedaría hacer es definir las funciones que son llamadas por los Listener, cosa que vamos a hacer a continuación. Atención a los comentarios:

[as]function onOpen(e:Event):void
{
// Aquí iría tu código cuando se inicia la carga… Podrías mostrar un cargador por ejemplo.
}

function onProgress(e:ProgressEvent):void
{
// Aquí podrías obtener el porcentaje de tú cargar y mostrárselo al usuario… una buena forma seria así:
// var porcentaje:Number = e.bytesLoaded/e.bytesTotal * 100;
// y mostrar la variable “porcentaje” en donde quieras.
}

function onComplete(e:Event):void
{
// Aquí podrías sacar el cargador y añadir el objeto cargado a la película de la siguiente forma:
// addChild(loader);
}[/as]

Lo mismo que con Loader y URLRequest, si estamos haciendo una clase importar las clases de eventos. En este caso serian flash.events.Event y flash.events.ProgressEvent o simplificar las dos en una linea así: flash.events.*
Con este código entonces podríamos cargar tanto SWF como JPG. Obviamente variarían algunas cosas, como que hacer con el objeto cargado, pero esta es una buena base para que sigan investigando.

El código completo:

[as]import flash.display.Loader;
import flash.events.*;
import flash.net.URLRequest;

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.OPEN, onOpen);
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);

loader.load(new URLRequest(“peliculaExterna.swf”));

function onOpen(e:Event):void
{
// Aquí iría tu código cuando se inicia la carga… Podrías mostrar un cargador por ejemplo.
}

function onProgress(e:Event):void
{
// Aquí podrías obtener el porcentaje de tú cargar y mostrárselo al usuario… una buena forma seria así:
// var porcentaje:Number = e.bytesLoaded/e.bytesTotal * 100;
// y mostrar la variable “porcentaje” en donde quieras.
}

function onComplete(e:Event):void
{
// Aquí podrías sacar el cargador y añadir el objeto cargado a la película de la siguiente forma:
// addChild(loader);
}[/as]

Espero les sirva como siempre digo, y espero comentarios, preguntas y sugerencias!
Saludos!

También te puede interesar:

  • aroundstudio
    hola !
    tengo una consulta podrias enviarme el codigo para poder cargar una pelicula externa con un archivo asociado as que permite rebatir planos y simular una habitacion 3d... el problema es que necesito introducir un cargador previo al swf con este .as asociado y no lo levanta no entiendo que estoy escribiendo mal,


    desde uruguay

    muchas gracias
  • Como andas Gastón?
    No entendí que es lo que no te funciona... a que llamas .as asociado... una clase principal del swf o que cosa?
    El cargador ponelo dentro del swf que está cargando... no en el primer frame del swf a cargar.
    Explicate mejor a ver si podemos ayudarte.

    Saludos!
  • Javier
    hola quisiera saber como puedo cargar imagenes desde una base de datos.
    Primero q las imagenes salgan en pequeño y luego al dar clic sobre ella se presente en en grande pero que no se pierdan las imagenes pequeñas para poder seleccionar otra imagen
  • Maria
    buenas tengo unas graficas en falsh y necesito pasarlas a un .pdf estoy trabajnado con php porfa ayudame..
  • No entiendo que es lo que necesitas!
    Saludos!
  • Seb
    Hola q tal, muy buen tutorial, me podrias ayudar con esto. Al cargar el swf extero todo bien, pero al redismensionarlo con scaleX y scaleY (hacerlo un poco más chica) me muestra los elementos que estan afuera del escenario del swf externo. Por que pasa esto?, como podría solucionarlo?

    Gracias y felices Fiestas.
  • si redimencionas con scale te cambia el tamaño de todo... o alejalos mas o usa una mascara, saludos!
  • kike
    Osea, quiero que dentro de este frame del mc_, una vez que cargue, quedé ahí y no finalice, y termine cuando cambio de pantalla (otro frame). No olviden que está todo dentro de una sola escena, y los botones estan en una principal por AS dentro del frame. Por tanto no tengo boton directo para decirle que finalice.
    saludos
  • kike
    parece que no me he explicado bien. En resumida cuentas, quiero cargar un .swf externo que a la vez llama a un archivo .XML , y en mi escena única donde voy avanzando de pantalla por FRAME en el momento de llamar al mc_ me muestra bien, pero en el output me sale "timer ended". Supongo que significa que el tiempo de mostrar el mc_ finalizó, y yo quiero que al salir de ese frame de la escena lo descargue y luego al entrar denuevo lo vuelva a cargar. Se entiende?.
    Aquí mando el AS del unico frame del mc_:

    import flash.display.Loader;
    import flash.events.*;
    import flash.net.URLRequest;

    var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.OPEN, onOpen);
    loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);

    loader.load(new URLRequest("videogallery.swf"));

    function onOpen(e:Event):void
    {
    // Aquí iría tu código cuando se inicia la carga… Podrías mostrar un cargador por ejemplo.
    }

    function onProgress(e:Event):void
    {
    // Aquí podrías obtener el porcentaje de tú cargar y mostrárselo al usuario… una buena forma seria así:
    // var porcentaje:Number = e.bytesLoaded/e.bytesTotal * 100;
    // y mostrar la variable “porcentaje” en donde quieras.
    }

    function onComplete(e:Event):void
    {loader.height=450;
    loader.width=660;
    addChild(loader);
    }


    eso es, saludos!
  • kike
    me parece que puede funcionar, pero esto como lo haria?.
    Como seria el codigo y donde lo ubico?
    saludos!
  • o en el mismo frame o en la linea de abajo del gotoAndStop(xframe);
    y el codigo es el mismo que estas usando para cargando en su momento
    Saludos!
  • kike
    hola weedo, primero doy las gracias por el AS3 aportado, porque es el unico que me ha servido. Mira yo inserté un .swf externo que no funciona con botones, sino que cada keyframe es como una escena, todo dentro de solo 1 escena. donde los botones son para cambiar a cada pantalla.Me explico?
    La cosa es que dentro de una de estas pantallas cargo el .swf dentro de un mc_ y me muestra bien, pero solo una vez. y me dice en el output "timer ended". Cuando paso a otra pantalla y vuelvo a esta, ya no me muestra nada, y se sigue sumando en el output el "timer ended".
    Realmente se poco de programacion, es mi primera pagina basada en una plantilla gratis y me ha ido bien, pero hasta aquí llegué. jeje
    Espero ayuda.
    saludos
  • Tene en cuenta que cada vez que vuelvas al frame tenes que cargar de nuevo el swf externo.
    Prueba si de esa forma se soluciona....

    Saludos!
  • melisa
    como puedo vaciar el movie clip antes de volver a cargar otro en el mismo MC y no se me amontones las animaciones una sobre otra

    Gracias!!
  • Melisa, usando un for es muy simple...

    var l:int = clip.numChildren-1
    for(var j = l; j >= 0;j--){
    clip.removeChildAt(j);
    }
  • mau
    Hola hice este tutorial...
    http://www.youtube.com/watch?v=8hAIW0ppDww
    para conoce como cargo swf externos, este me funciono de maravilla pero despues hice una variacion q me causan problemas.

    en vez de cargar un swf o un jpg, cargo un swf q en su interior tiene un componente de reproductor d video q carga un flv.
    cuando le doy click a un boton para q descargue....
    removeChild(myVideo.swf);
    ... y cargue otra pelicula distinta, el audio del flv sigue sonando

    para lo anterior puedo usar SoundMixer.stopAll(); pero esto puede detenerme el sonido ambiente de mi aplicación o de algun reproductor de mp3 que use.

    Alguien sabe como contrarestar el sonido de ese flv sin usar SoundMixer.stopAll(); ?
  • en vez de usar SoundMixer.stopAll(); solo cierra la conexion del flv... si usas un componente utiliza nom_componente.pausa() o stop(); antes de usar el removeChild
  • manuel
    tengo una duda sobre la carga de varios SWF en un movie clip con el evento de botones, logre la carga de swf externo pero, como puedo hacer y prometo que intente, vaciar el movie clip antes de volver a cargar otro en el mismo MC y no se me amontones las animaciones una sobre otra. ojala puedan ayudarme gracias.
  • felix proba en la funcion cuando se completa la carga

    function onComplete(e:Event):void
    {
    loader.height=150;
    loader.width=150;
    addChild(loader)
    }

    no estoy seguro que funcione, ya q estas cambiando el tamaño al objeto loader y no a la imagen.
    pero fijate, si no funciona avisa e investigamos mejor!

    Saludos
  • Perfecto, como se puede fijar las dimensiones de la imagen que hemos cargado. ya que con

    loader.x=100;
    loader.y=10;

    puede posiciones la imagen, pero no admite

    loader.height=150;
    loader.width=150;

    No da error, pero no muestra nada.

    Osea, como puedo hacer para redimensionar una imagen???
  • Muchas Gracias, estuve luchando por un tiempo con la carga de datos en AS3 hasta que di con tu foro, eralmente muy buen trabajo, ojala pudiera redactr asi en mi blog :( .. jejeje en fin:

    Felicitaciones de nuevo.

    PD: Al fin un videotutorial en argento !! :D
  • william fijate que tienes mal puesto un }
    en el metodo constructor "cargador" fijate q esta vacio...
    y abajo de el hay varias lineas que esta sueltas en la clase...

    Deberían ir dentro del metodo "cargador"

    Fijate bien la sintaxis y si te devuelve un error intenta detectarlo, ya que flash es muy especifico con el problema :D

    Igual siempre son bienvenidas las dudas en el blog!

    Saludos
  • william
    este es el codigo de mi clase, por si alguna cosa


    package c_cargando
    {
    import flash.display.Loader;

    import flash.events.*;

    import flash.net.URLRequest;


    public class cargador
    {

    public function cargador():void
    {

    }


    var loader:Loader = new Loader();

    loader.contentLoaderInfo.addEventListener(Event.OPEN, onOpen);

    loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);

    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);



    loader.load(new URLRequest("lupa.swf"));



    private function onOpen(e:Event):void

    {
    trace('inicia carga');
    // Aquí iría tu código cuando se inicia la carga... Podrías mostrar un cargador por ejemplo.

    }



    private function onProgress(e:Event):void

    {

    // Aquí podrías obtener el porcentaje de tú cargar y mostrárselo al usuario... una buena forma seria así:

    var porcentaje:Number = e.bytesLoaded/e.bytesTotal * 100;

    trace('porcentaje');

    // y mostrar la variable "porcentaje" en donde quieras.

    }



    private function onComplete(e:Event):void

    {

    trace('carga completa');

    // Aquí podrías sacar el cargador y añadir el objeto cargado a la película de la siguiente forma:

    addChild(loader);

    }

    }
    }
  • william
    ey men, aplique tu codigo a una clase, pero me genera errores

    1120: Acceso a una propiedad loader no definida
    1120: Acceso a una propiedad onOpen no definida

    y asi con todos los metodos, por favor espero una ayuda,

    gracias
  • Jesús y Lexo:
    El problema es simple... el atributo "private" que hay delante de las funciones va solamente si usan este codigo en una clase... de lo contrario deberian sacar esa palabra de las declaraciones de las functiones...

    Cambie el código, para que no se generen confuciones...

    Saludos!
  • Jesús
    A mí también me pasa lo mismo, me da el error 1013, he puesto el mismo código que esta aquí arriba.
    lo que lo he puesto dentro de un fotograma dentro de una película que no esta en la principal yo solo quiero que en ese frama me carge esa pelicula y puntoo :(

    Gracias de antemano!
  • Pegá por lo menos las primeras lineas de tu código acá, asi veo que puede ser... o mandame el código a mi contacto y lo veo completo.

    Saludos!
  • Lexo
    hoy me he puesto a revisar todos tus ejemplos me da este error: 1013: El atributo private sólo se puede utilizar en definiciones de propiedad de clase.

    en 3 lineas
blog comments powered by Disqus

DeCabeza.net usa WordPress y el tema FREEmium.
desarrollado por Dariusz Siedlecki y modificado por DeCabeza.net