Saturday, February 4, 2012

Cargar SWF o JPG externos con ActionScript 3

Posteado por Antonio con fecha Julio - 17 - 2009

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):

Actionscript:

  1. import flash.display.Loader;

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

Actionscript:

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

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 elcontentLoaderInfo.
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 elEvent.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 objetoLoader. Lo hacemos de la siguiente manera:

Actionscript:

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

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:

Actionscript:

  1. function onOpen(e:Event):void
  2. {
  3. // Aquí iría tu código cuando se inicia la carga… Podrías mostrar un cargador por ejemplo.
  4. }
  5. function onProgress(e:ProgressEvent):void
  6. {
  7. // Aquí podrías obtener el porcentaje de tú cargar y mostrárselo al usuario… una buena forma seria así:
  8. // var porcentaje:Number = e.bytesLoaded/e.bytesTotal * 100;
  9. // y mostrar la variable “porcentaje” en donde quieras.
  10. }
  11. function onComplete(e:Event):void
  12. {
  13. // Aquí podrías sacar el cargador y añadir el objeto cargado a la película de la siguiente forma:
  14. // addChild(loader);
  15. }

Lo mismo que con Loader y URLRequest, si estamos haciendo una clase importar las clases de eventos. En este caso serian flash.events.Event yflash.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:

Actionscript:

  1. import flash.display.Loader;
  2. import flash.events.*;
  3. import flash.net.URLRequest;
  4. var loader:Loader = new Loader();
  5. loader.contentLoaderInfo.addEventListener(Event.OPEN, onOpen);
  6. loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
  7. loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
  8. loader.load(new URLRequest(”peliculaExterna.swf”));
  9. function onOpen(e:Event):void
  10. {
  11. // Aquí iría tu código cuando se inicia la carga… Podrías mostrar un cargador por ejemplo.
  12. }
  13. function onProgress(e:Event):void
  14. {
  15. // Aquí podrías obtener el porcentaje de tú cargar y mostrárselo al usuario… una buena forma seria así:
  16. // var porcentaje:Number = e.bytesLoaded/e.bytesTotal * 100;
  17. // y mostrar la variable “porcentaje” en donde quieras.
  18. }
  19. function onComplete(e:Event):void
  20. {
  21. // Aquí podrías sacar el cargador y añadir el objeto cargado a la película de la siguiente forma:
  22. // addChild(loader);
  23. }

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

le agradesemos a http://www.DeCabeza.net  por los textos

Popularity: 5% [?]

4 Respuestas

  1. Paul Said,

    Buenas, muchas gracias por el post, está clarísimo

    Lo que pasa es uqe la primera vez que lo cargo no me muestra la animacion
    del preloader cargada en Event.OPEN, en los siguiente botones que hago click sí, ya muestra correctamente.
    A la clase cargador se la agregué al Main.as

    Publicado Agosto 2nd, 2009 at 18:44

  2. Antonio Said,

    Hola Paul…. bueno estaría más claro si me pasas el CODIGO, ya que así te podré dar un respuesta apropiada.
    O mejor si querés postea los archivos;

    Espero tu data
    Saludos
    Toni

    Publicado Agosto 3rd, 2009 at 9:31

  3. pixelmr Said,

    Saludos. Gracias por las aportaciones.
    ¿Cómo puedo cargar un SWF en un nivel especifico como en as2? Se pueden manejar niveles en AS3?

    Publicado Octubre 22nd, 2009 at 0:40

  4. Antonio Said,

    Hola!
    Con respecto a tu primer pregunta, te adjunto un Post de Adobe… Está muy completo… espero que te sirva:
    Función loadMovieNum

    loadMovieNum(url:String, level:Number, [method:String]) : Void

    Carga un archivo SWF, JPEG, GIF o PNG en un nivel mientras se reproduce el archivo SWF original. En Flash Player 8 se ha añadido compatibilidad con archivos GIF no animados, archivos PNG y archivos JPEG progresivos. Si carga un archivo GIF animado, sólo se mostrará el primer fotograma.

    Sugerencia: si desea controlar el progreso de la descarga, utilice MovieClipLoader.loadClip() en lugar de esta función.

    Normalmente, Flash Player muestra un solo archivo SWF y se cierra. La acción loadMovieNum() permite mostrar varios archivos SWF simultáneamente y cambiar entre archivos SWF sin cargar otro documento HTML.

    Si desea especificar un destino en lugar de un nivel, utilice loadMovie() en lugar de loadMovieNum().

    Flash Player tiene un orden de apilamiento de niveles a partir del nivel 0. Estos niveles son como capas de acetato: son transparentes, excepto en los objetos de cada nivel. Cuando utilice loadMovieNum(), debe especificar un nivel en Flash Player donde se cargará el archivo SWF. Cuando se carga un archivo SWF en un nivel, puede utilizar la sintaxis _level N, donde N es el número de nivel, para buscar el archivo SWF.

    Cuando cargue un archivo SWF, puede especificar cualquier número de nivel y puede cargar archivos SWF en un nivel que ya tenga un archivo SWF cargado. De esta forma, el nuevo archivo SWF sustituirá al archivo SWF existente. Si carga un archivo SWF en el nivel 0, se descargarán todos los niveles de Flash Player y se sustituirá el nivel 0 por el nuevo archivo. El archivo SWF en el nivel 0 establece la velocidad de fotogramas, el color de fondo y el tamaño de fotograma de todos los demás archivos SWF cargados.

    La acción loadMovieNum() también permite cargar archivos JPEG en un archivo SWF durante su reproducción. En las imágenes y archivos SWF, la esquina superior izquierda de la imagen se alinea con la esquina superior izquierda del escenario cuando se carga el archivo. Además, en ambos casos, el archivo cargado hereda la rotación y la escala, y el contenido original se sobrescribe en el nivel especificado.

    Nota: los archivos JPEG guardados en formato progresivo no son compatibles.

    Utilice unloadMovieNum() para eliminar los archivos SWF o las imágenes que se cargaron con loadMovieNum().

    Cuando utilice este método, puede ser conveniente usar el modelo de seguridad de Flash Player.

    Para Flash Player 8:

    Es posible que no se pueda realizar la carga si el clip de película que realiza la llamada está en la libre configuración local con acceso al sistema de archivos y el clip de película cargado procede de la libre configuración de red.
    No se permite la carga si el archivo SWF que realiza la llamada está en la libre configuración de red y el clip de película que se va a cargar es local.
    Para acceder a la libre configuración de red desde la libre configuración local de confianza o local con acceso a la red se necesitan permisos del sitio Web a través de un archivo de política de varios dominios.
    Los clips de película de libre configuración local con sistema de archivos no pueden crear scripts para clips de película de libre configuración local con acceso a la red (tampoco se puede realizar la operación inversa).
    Flash Player 7 y versiones anteriores:

    Los sitios Web pueden conceder acceso a varios dominios a un recurso mediante un archivo de política de varios dominios.
    La creación de scripts entre archivos SWF está limitada según el dominio de origen de los archivos SWF. Utilice el método System.security.allowDomain() para ajustar estas restricciones.
    Para más información, consulte lo siguiente:

    Capítulo 17, “Aspectos básicos de la seguridad,” en Aprendizaje de ActionScript 2.0 en Flash.
    El documento técnico sobre la seguridad de Flash Player 9 en http://www.adobe.com/go/fp9_0_security_es
    El documento técnico sobre interfaces API relativas a seguridad de Flash Player 8 en http://www.adobe.com/go/fp8_security_apis_es
    Disponibilidad: ActionScript 1.0; Flash Player 4 – Los archivos de Flash 4 abiertos en Flash 5 o versiones posteriores se convierten para que utilicen la sintaxis correcta. La capacidad de cargar archivos JPEG está disponible desde Flash Player 6. La capacidad de cargar archivos GIF sin animar, archivos PNG o JPEG progresivos está disponible desde Flash Player 8.

    Parámetros

    url: String – URL absoluta o relativa del archivo SWF o JPEG que se va a cargar. Una ruta relativa debe ser relativa al archivo SWF en el nivel 0. Para utilizar Flash Player de forma independiente o para realizar pruebas en el modo de prueba de la aplicación de edición de Flash, todos los archivos SWF deben almacenarse en la misma carpeta y los nombres de archivo no pueden contener especificaciones de carpeta o unidad de disco.

    level: Number – Entero que especifica el nivel de Flash Player en el que se cargará el archivo SWF.

    method: String [opcional] – Especifica un método HTTP para enviar variables. El parámetro debe ser la cadena GET o POST. Si no hay ninguna variable para enviar, omita este parámetro. El método GET añade las variables al final de la URL y se utiliza para un número reducido de variables. El método POST envía las variables en un encabezado HTTP independiente y se utiliza para enviar cadenas de variables largas.

    Espero que te sirva..

    En relación a AS3, si perfectamente y más comodo (a mi opinión que as2):
    Para los programadores Flash en AS3 obtener en que nivel se encuentra un movieclip puede brindar una importante información, sin embargo existe mucha complicación al obtener el indice.
    A continuación un ejemplo de como obtener el indice de cualquier movieclip de una forma muy facil.
    //Forma declarativa para principiantes, buena practica de programación
    var target:DisplayObject = getChildByName(tuMovieClip.name);
    var mIndex:Number = getChildIndex(target);
    //Forma rapida, para ya iniciados en as3
    var mIndex:Number = getChildIndex(getChildByName(myMovieClip.name));
    //Mediante una funcion
    function getMovieClipIndex(myMovieClip:MovieClip):Number{
    return getChildIndex(getChildByName(myMovieClip.name));
    }
    En este caso myMovieClip es el MovieClip que deseas obtener su indice, es indispensable especificar como en el ejemplo el nombre de este MovieClip con la propiedad “name” la cual nos retorna el nombre unico del MovieClip, ya sea asignado por as3 o nosotros.
    El indice de un MovieClip nos determina la profundidad en que se encuentra nuestra MovieClip dentro del SWF, recuerda que los elementos de cualquier SWF se encuentra cada uno en distintos niveles o capas.

    Saludos

    Publicado Octubre 23rd, 2009 at 20:47

Añadir un comentario