Comunidad de diseño web y desarrollo en internet online

Cargar Imagen en AS3 de la forma mas AS2 Posible

Citar            
MensajeEscrito el 01 Dic 2008 04:07 pm
hola, he visto muchas paginas donde muestran como cargar una imagen en AS3, pero en todas salen, o clases, o loaders, o solo Acciones, yo, desde AS2, uso algo muy practico y sencillo, que es, darle una instancia a un movieclip, y luego en el panel de acciones:

Código :

instancia.loadMovie("Pelicula.jpg", false)


así era muy sencillo, y muy practico para hacer por ejemplo un programa con miniaturas y con fotos grandes, quisiera saber, si hay una forma de hacer algo similar en AS3, donde el loader sea un MovieClip, y no necesite archivos externos(a excepción de las imágenes xD).

gracias!

Por JK994

65 de clabLevel



Genero:Masculino  

safari
Citar            
MensajeEscrito el 01 Dic 2008 06:43 pm
No es tan complicado un objeto loader, en lugar de instanciar un MC, creas un objeto loader al principio de tu película, y lo añades al stage.

Código ActionScript :

//lo declaras al principio
var loader:Loader=null;

//en tu función Main(*)
function Main(){
   //lo añades
   loader=new Loader();
   loader.x=100;
   loader.y=200;
   loader.addChild()
}

//ya sólo queda, cuando quieres cargar algo escribir
loader.load(new URLRequest("Pelicula.jpg")) 

(*)Si no tienes Clase de Documento y escribes el código directamente en el primer frame escribes todo seguido

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 01 Dic 2008 09:29 pm
hola, muchas gracias, este es un codigo verdaderamente facil, tal como yo lo estaba buscando, pero lo que estoy haciendo, es un sistema de ventanas arrastrables, y si creo el movieclip, o el loader, no lo voy a poder mover junto a toda la ventana, hay forma que en vez de crear un loader, poder cargar la imagen en un MC?
gracias

Por JK994

65 de clabLevel



Genero:Masculino  

safari
Citar            
MensajeEscrito el 02 Dic 2008 08:11 am
Perdona, que me colé, NO es loader.addChild(), sino adChild(loader)
Aí que, añade el loader, en lugar de al stage, al MC

Código ActionScript :

loader=new Loader(); 
mimc.addChild(loader) //en lugar de addchild(loader)
...
loader.load(new URLRequest("Pelicula.jpg"))

¡Un momento!, escribimos loader.load(..) en lugar de mimc.loader.load(..)
Vale, eso es porque la variable "pertenece" a la película principal. Hagamos que "pertenezca al MC"

Código ActionScript :

public class Main extends MovieClip 
   {
      private var rect:MovieClip = new MovieClip();
      function Main(){
         rect.graphics.beginFill(0xFFAAFF);
         rect.graphics.drawRect(0, 0, 100, 100);
         rect.graphics.endFill();
         addChild(rect);
         var ldr:Loader = new Loader();
         rect.loader=(rect.addChild(ldr)); //<---ESTA
         var url:String = "pelicula.jpg";
         var urlReq:URLRequest = new URLRequest(url);
         rect.loader.load(urlReq);
         rect.loader.addEventListener(MouseEvent.MOUSE_DOWN, cambia);
      }
      private function cambia(e:Event):void
      {
         rect.loader.unload();
      }
   }

Vemos que la "clave" es asignar la variable en la línea

Código ActionScript :

rect.loader=(rect.addChild(ldr)); 

Observemos también que la variable ldr, ha pasado a ser local en nuestra función Main.

********CREAR UNA CLASE**********
Que supongo que es por dónde van los tiros. Ahora que conocemos un poco más cómo va todo, hagámonos una Clase que extienda de MovieClip, que en su función principal cree el loader.

Código ActionScript :

public class Thumbail extends MovieClip{
      private var _loader:Loader=null;
      function Thumbail(){
         var tmp:Loader=new Loader();
         _loader = Loader(addChild(tmp));
      }
      public function loadMovie(url:String):void{
         _loader.load(new URLRequest(url));
      }
   }

Nuestra función Main quedaría como

Código ActionScript :

public class Main extends MovieClip 
   {
      private var mimc:Thumbail = null;
      function Main()
      {
         var tmp:Thumbail = new Thumbail();
         mimc = Thumbail(addChild(tmp));
         mimc.loadMovie("Picture.jpg");
      }
        }

Vale, esta clase no nos dice cuándo se ha cargado la película, el porcentaje de carga...
Hagamos que nuestra clase Thumbail "dispache" un evento

Código ActionScript :

public class Thumbail extends MovieClip{
      private var _loader:Loader=null;
      function Thumbail(){
         var tmp:Loader=new Loader();
         _loader = Loader(addChild(tmp));
         _loader.contentLoaderInfo.addEventListener(Event.INIT, initHandler); //<---añadimos el evento
      }
      private function initHandler(e:Event):void
      {
         dispatchEvent(new Event(Event.INIT)); //<---dispachamos el evento
      }
      public function loadMovie(url:String):void{
         _loader.load(new URLRequest(url));
      }
   }

Ahora podemos cambiar nuestra Clase Main como

Código ActionScript :

public class Main extends MovieClip 
   {
      private var mimc:Thumbail = null;
      function Main()
      {
         var tmp:Thumbail = new Thumbail();
         mimc = Thumbail(addChild(tmp));
         mimc.loadMovie("picture.jpg");
         mimc.addEventListener(Event.INIT, cambia); //<--añadimos el evento
      }
      private function cambia(e:Event):void
      {
                        mimc.alpha = .2;
      }
   }

Vale, igual también nos interesa "dispatchar" el evento cuando empieza la carga, o queremos controlar el porcentaje, o queremos controlar si no existe el fichero... Es cuestión de añadir listener en la clase Thumbail al _loader.contentLoaderInfo, y dispachar el evento correspondiente (lo dejamos como ejercicio) :wink:

Si tus "thumbails" son arrastrables, añadamos el controlador arrastrable en la clase... ¿quién dijo que no era divertido la OOP?

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 02 Dic 2008 08:59 am
Algún comentario sobre el código:
He elegido como nombre de la función que carga la imagen, loadMovie que nos recuerda a nuestro querido AS.1 (nunca programé en AS.2)

También he elegido que el evento que se "dispache" sea "Event.INIT". Event.INIT es sólo un STRING, pero me parecía correcto "dispachar" ese STRING y no otro para que nuestro Thumbails se parezca a la Clase Loader.

El motivo de que nuestra Clase Thumbail pueda dispachar eventos es que extiende de MovieClip que implementa la interfac EventDispatcher -no lo podríamos haber hecho así si nuestra Clase extendiera de, p.e. Shape-

Pensándolo mejor, los únicos eventos que debería "dispachar" sería si no existe el fichero o cuando se ha cargado. (lo de los bytes cargados sólo le interesa a la clase). Aunque podemos crear funciones que nos devuelvan los bytes cargados

El que hagamos que "dispache" un evento no quiere decir que por cojones lo tengamos que "capturar" en la función Main.

Y finalmente: ¿alguién sabe cómo diablos traducimos lo de "dispachar"?

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 02 Dic 2008 03:39 pm
perdón pero seque, jeje, no entiendo muy bien, el uso de las clases, y la idea mia es crear mi programa, compilando solo los archivos básicos, imágenes, sonidos y película flash, intente con tu primer código, y luego le arregle lo del addChild, pero me sale el siguiente error:

"TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
at Sinti_fla::MainTimeline/frame1()"

se que mensionaste algo de que si no uso clases, debo de escribir todo seguido, pero no entiendo, que parte de eso tengo q escrbiri seguido, gracias.

respecto a los códigos que luego me proporcionaste, usan clases, y pues, si es necesario, muchas gracias, pero quiero buscar la forma de hacerlo lo mas compacto posible, y una pregunta mas, cuando creo el loader, y si lo creo dentro de un movieclip, al arrastrar ese movieclip, el loader también lo hace?

gracias

Por JK994

65 de clabLevel



Genero:Masculino  

safari
Citar            
MensajeEscrito el 02 Dic 2008 04:33 pm

JK994 escribió:

perdón pero seque, jeje, no entiendo muy bien, el uso de las clases

No es cierto, llevas usando Clases toda la vida, lo que ocurre es que no lo has hecho conscientemente. Una Clase es la Clase MovieClip, la Clase Array, la Clase Math.... Así que vale ya de decir que no has usado Clases...
Me dices que no has hecho es crear una clase propia extendiéndola de otra. Reconozco que suena complicado, pero no lo es tanto. Cuando tienes un MovieClip (uno sencillo que sea un círculo). Eso es una Clase que extiende de MovieClip. Sí, es un MovieClip pero no es sólo un MovieClip porque tiene un circulo. ¡Has creado una Clase nueva que extiende de MovieClip!

Vale, (aquí te lo reconozco) Sí es cierto que la idea de clase significa de agún modo escribir código dentro del símbolo (eso se ha hecho desde Flash 5). De modo que cada vez que hacíamos un attachMovie, tenía todos los comportamientos del Símbolo. En AS.3 la OOP sale casi sin querer porque casi te obligan a ello.

JK994 escribió:

se que mensionaste algo de que si no uso clases, debo de escribir todo seguido, pero no entiendo, que parte de eso tengo q escrbiri seguido, gracias.

Pues me expliqué como un libro cerrado :shock:
Suena un poco complicado y todo viene de una disyuntiva.
1.-Podemos escribir el código en un frame de la película principal (o en un .as y ponemos en ese frame)

Código ActionScript :

import fichero.as

2.-Podemos decirle a nuestra película que procede de una "clase de documento" (en las propiedades de la película) y crear ese fichero .as (que tiene que llamarse igual que la "clase de documento").

Sí, tenemos las dos opciones. Aunque Flash lo va a traducir siempre a la segunda forma. Imaginemos algo sencillo, una película con un MC dentro con nombre de instancia "mimc" y código en el primer frame

Código ActionScript :

var variable:Number=100;
mimc.vel=10;
mimc.addEventListener(Event.ENTER_FRAME,mover)
function mover(e:event):void{
   mimc.x+=mimc.vel;
}

Es "lo mismo" que, si le diéramos como clase de documento "Main" y escribiéramos en un fichero main.as

Código ActionScript :

package{
    Class Main extends MovieClip{
         //parte de declaración de variables
        public var variable:Number=100;
        public var mimc:MovieClip;
       function Main(){
            //parte de poner los MCs en el stage
            mimc=new MovieClip();
            mimc.x=100; //<--el valor que tuviera en tiempo de diseño
            mimc.y=100; //<--el valor que tuviera en tiempo de diseño
            addChild(mimc);
            //código que antes estaba en el frame
            mimc.vel=10
            mimc.addEventListener(Event.ENTER_FRAME,mover)
        }
        private function mover(e:event):void{
            mimc.x+=mimc.vel;
       }
    }
}

Lo del package es algo que nos tenemos que tragar -dá para más de un post-
Sí, nuestra "clase de documento" extiende de MovieClip, pero no es más que eso
La parte de declarar las variables queda FUERA de esa funcion Main (que se llama constructor). Observa que están tanto las variables que declaramos en el frame como unas variables que se corresponden con el "nombre de instancia" de los MovieClips, y que todas son "public".
El resto iría en la función Main (en la función constructora). Lo que pasa es que las funciones que utilizamos las dejamos fuera.

Por eso, si tenemos el código de una "Clase de documento", la podemos poner en un frame "todo seguido", que quiere decir, sin declarar package, y sin función constructora. Tomemos aliento, porque no es fácil de entender a la primera y es importante conocer cómo funciona Flash y cómo compila Flash. Y es importante que nos vayamos acostumbrando a crear nuestro fichero main.as y a decirle a nuestra película que tiene como clase de documento Main.

JK994 escribió:

respecto a los códigos que luego me proporcionaste, usan clases, y pues, si es necesario, muchas gracias, pero quiero buscar la forma de hacerlo lo mas compacto posible

ES compacto. De hecho es el modo de hacer las cosas más compactas y reutilizables. Sí es cierto que tienes que tener un .as por cada Clase que crees (al principio suena ilógico -y puede que lo sea-, pero el .swf que se crea es único, aunque es cierto que, si quieres usar deberás, o bien añadir las clases al proyecto -copiándote todos los .as (menudo rollo) o importarlo con un import. ¡¡Sólo con un import podrás usar lo que has hecho antes!! (antes nos teníamos que importar las librerías, compartirlas y mil demonios más)
No sé cómo convencerte de la "bondad de las clases". Sí me gustaría que no nos asustara el nombre, porque es sólo eso, un nombre. ¿que tenemos más ficheros .as? Personalmente a mí me gusta más esta idea que ir buscando código desperdigado por todos los MCs, aunque para gustos están los colores -pero ¡ojo! que nos vamos a tener que ir acostumbrando al "gusto Adobe"-

JK994 escribió:

y una pregunta mas, cuando creo el loader, y si lo creo dentro de un movieclip, al arrastrar ese movieclip, el loader también lo hace?

A esto es más fáicl responder: Sí, es como cuando teníamos un MC dentro de otro MC, cuando arrastramos el MC "contenedor" todo lo que hay dentro se mueve también

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 02 Dic 2008 04:33 pm
perdón era

Código ActionScript :

public class Main extends MovieClip{....}

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 02 Dic 2008 05:06 pm
ok, luego de la explicacion, de que al crear un contenedor, o un loader, dentro de un movie clip, creo que ya tengo como la base de lo que quiero hacer, solo que tengo un incomveniente, en el comentario anterior, te mostre el error que me sale al compilar el SWF, y yo creo que para el visor de imagenes que quiero hacer, es suficiente con ese codigo, me podias ayudar a solucionar ese problema? gracias.

de verdad que me has ayudado, no sabia que toda la vida use clases :D jeje, y hay una forma como de migrar esos archivos .as a el frame?

gracias

Por JK994

65 de clabLevel



Genero:Masculino  

safari
Citar            
MensajeEscrito el 02 Dic 2008 05:48 pm
Lo del error es que dije que escribieras

Código ActionScript :

mimc.addChild(loader) //en lugar de addchild(loader) 

porque suponía que tenías en el Stage un MC cuyo nombre de instancia era "mimc" -que era donde querías hacer el loadMovie de la película o de la imagen- si tu MC se llama de otro modo, pues eso

Código ActionScript :

instancia.addChild(loader)

en ese sentido es parecido al attachMovie

Si sólo estuviéramos hablando de la Clase de Documento es eso de "escribir todo seguido". Vamos quitar lo del package y, en lugar de la función constructora, no ponerla y poder el código todo seguido. Claro que no es inmediato, pero esa es la idea. Como tenemos varias clases (la Clase Documento y la Clase Thumbail) creo que no se puede -no lo he probado-

NOTA:No puse ningún import, que habría que añadir al código

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 02 Dic 2008 09:45 pm
ok, el codigo que usea al final fue

//lo declaras al principio
var loader:Loader=null;

//en tu función Main(*)
function Main(){
//lo añades
loader=new Loader();
loader.x=100;
loader.y=200;
mimc.addChild(loader)
}

//ya sólo queda, cuando quieres cargar algo escribir
loader.load(new URLRequest("Pelicula.jpg"))

y lo unico que cree fue un movieclip con nombre de instancia "mimc"

pero me sale el mismo error de antes :(

Por JK994

65 de clabLevel



Genero:Masculino  

safari
Citar            
MensajeEscrito el 15 Dic 2008 09:37 pm
me pueden ayudar, por favor? :(

Por JK994

65 de clabLevel



Genero:Masculino  

safari
Citar            
MensajeEscrito el 16 Dic 2008 12:24 am
ejecuta la función Main. En tu código solo la has declarado.

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.