Comunidad de diseño web y desarrollo en internet online

Problema con la clase Reflect

Citar            
MensajeEscrito el 01 Oct 2009 09:48 am
Hola a tod@s, es la primera vez que voy a usar la clase Reflect y no consigo el efecto deseado, no sé que es lo que hago mal, pues he hecho varias pruebas pero nada, a ver si alguien puede echarme una mano.
Les adjunto la función en cuestion para que vean y después les cuento:

Código ActionScript :

private function onLoadInit(e:Event):void {
         ldr.width = _w;
         ldr.height = _h;
         
         mc = new MovieClip();
         mc.x = _x;
         mc.y = _y;
         mc.addChild(ldr);
         
         obj = new Object();
         obj.mc = mc;
         obj.alpha = 50;
         obj.ratio = 170;
         obj.distance = 0;
         obj.updateTime= -1;
         obj.reflectionDropoff = 70;
         
         var r1:Reflect = new Reflect(obj);
         
         container_mc.useHandCursor = true;
         container_mc.buttonMode = true;
         container_mc.x = 0;
         container_mc.y = 0;
         container_mc.addChild(mc);
         this.addChild(container_mc);
      }



ldr:Loader lo defino en otra función y allí le cargo un PNG
mc:Movieclip es donde cargo la imagen
container_mc: es un MC que ya está instanciado y es donde pongo todos los objetos de mi clase para tenerlos bien organizados.

Me muestra la imagen correctamente pero no me muestra la reflexión. También he probado a hacer:
container_mc.addChild(r1);
y tampoco me funciona.

Espero me puedan ayudar.
Muchas gracias a tod@s

Pimager

Por Pimager

38 de clabLevel



 

firefox
Citar            
MensajeEscrito el 01 Oct 2009 10:38 am
Vamos, la Clase Reflect, lo que hace es, en momento que la creamos, ver el contenido del MC y hacer un "espejo". El valor de updateTime (si no es -1) hace que este proceso se repita cada los milisegundos que le indiquemos. Por eso, para un video, le podemos como valor un 0.

Si le ponemos un -1 sólo lo hará una vez -es lo indicado para una imagen-, pero claro, debemos esperar a que se haya cargado la imagen.

Para saber cuándo ha acabado la imagen de cargar, le añades un listener al loader.contentLoaderInfo

Código ActionScript :

loader.contentLoaderInfo.addEventListener(Event.INIT, initHandler);
function initHandler(e:Event){
   ...aquí es donde definimos nuestro objeto Reflect....


Para ver más sobre la Clase Reflect

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 01 Oct 2009 10:58 am
Hola Eliseo2, me ha servido mucho lo de updateTime, no sabía para que se usaba, pero como en todas partes había un -1 pues le puse el -1.
Por otro lado ya hago lo que me has comentado, pues mi clase es la siguiente:

Código ActionScript :

public class Images extends MovieClip
{
  public function Images(){
       container_mc = new MovieClip();
       ldr = new Loader();
       ldr.load(new URLRequest(_url));
       ldr.contentLoaderInfo.addEventListener(Event.INIT, onLoadInit);
  }
  private function onLoadInit(e:Event):void {
   ldr.width = _w;
   ldr.height = _h;
      
   mc = new MovieClip();
   mc.x = _x;
   mc.y = _y;
   mc.addChild(ldr);
   
   obj = new Object();
   obj.mc = mc;
   obj.alpha = 50;
   obj.ratio = 170;
   obj.distance = 0;
   obj.updateTime= -1;
   obj.reflectionDropoff = 70;
         
   var r1:Reflect = new Reflect(obj);
   
   container_mc.useHandCursor = true;
   container_mc.buttonMode = true;
   container_mc.x = 0;
   container_mc.y = 0;
   container_mc.addChild(mc);
   this.addChild(container_mc);
 }
}


Por tanto entiendo que ya tengo la imagen cargada cuando llamo al obketo Reflect no? entonces no entiendo porque no funciona. Se te ocurre algo?

Muchas gracias
Pimager

Por Pimager

38 de clabLevel



 

firefox
Citar            
MensajeEscrito el 01 Oct 2009 11:43 am
Perdona, dije cuando se carga la imagen, quería decir cuando está en la "displayList" (luego, en tu caso sería después de añadir el "container_mc")

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 01 Oct 2009 01:27 pm
Eliseo2 he hecho lo que dices, te lo muestro a continuacion en el codigo que adjunto y no me lo muestra

Código ActionScript :

public class Images extends MovieClip 
{ 
  public function Images(){ 
       container_mc = new MovieClip(); 
       ldr = new Loader(); 
       ldr.load(new URLRequest(_url)); 
       ldr.contentLoaderInfo.addEventListener(Event.INIT, onLoadInit); 
  } 
  private function onLoadInit(e:Event):void { 
   ldr.width = _w; 
   ldr.height = _h; 
       
   mc = new MovieClip(); 
   mc.x = _x; 
   mc.y = _y; 
   mc.addChild(ldr); 
    
   obj = new Object(); 
   obj.mc = mc; 
   obj.alpha = 50; 
   obj.ratio = 170; 
   obj.distance = 0; 
   obj.updateTime= -1; 
   obj.reflectionDropoff = 70; 
          
   container_mc.useHandCursor = true; 
   container_mc.buttonMode = true; 
   container_mc.x = 0; 
   container_mc.y = 0; 
   container_mc.addChild(mc); 
  
   var r1:Reflect = new Reflect(obj); 
   this.addChild(container_mc); 
  //var r1:Reflect = new Reflect(obj); 
   
  } 
} 


Como ves lo he probado instanciando "r1" antes y después de añadir "container_mc" y no resulta, supongo que no debo hacer algun "addChild(r1)".
Realmente esmuy raro no?

Muchas gracias,
Pimager

pd.: la imagen en si sí que me la carga, con lo cual por ahí no puede ser que me haya dejado ningún "addChild()"

Por Pimager

38 de clabLevel



 

firefox
Citar            
MensajeEscrito el 02 Oct 2009 06:43 am
De nuevo, mi "curso de lectura rápida" me ha hecho una mala jugada.
Dije "cuando se añade a la DisplayList". Vale, me refiero a cuando está realmente en la DisplayList. Un objeto de Tu Clase Images no se ha añadido al stage hasta que no haces un ADD_TO_STAGE. Vamos, deberíamos añadir el evento ADD_TO_STAGE

Código ActionScript :

public function Images(){  
       container_mc = new MovieClip();  
       ldr = new Loader();  
       ldr.load(new URLRequest(_url));  
       ldr.contentLoaderInfo.addEventListener(Event.INIT, onLoadInit); 

//añadimos el evento addToStage
       this .addEventListener(Event.ADD_TO_STAGE,onStage)
  }
//es en la función onStage donde creamos el reflect
private function onStage(e:Event):void{
   obj = new Object();  
   obj.mc = mc;  
   obj.alpha = 50;  
   obj.ratio = 170;  
   obj.distance = 0;  
   obj.updateTime= -1;  
   obj.reflectionDropoff = 70;  
   var r1:Reflect = new Reflect(obj);  
}
...resto de código....

Claro, en la función onLoadInit quitamos todo el código referido al "Reflect"

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 02 Oct 2009 08:51 am
Eliseo2, nada que no hay manera, sigue sin crearme el reflejo, lo he probado poniendo:
this.addEventListener(Event.ADDED_TO_STAGE, onStage); i
ldr.addEventListener(Event.ADDED_TO_STAGE, onStage); i nada de nada, estoy flipando.

Muchas gracias por tu tiempo
Pimager

Por Pimager

38 de clabLevel



 

firefox
Citar            
MensajeEscrito el 02 Oct 2009 10:29 am
Puff, ya lo tengo. He creado una Clase Images. Esa clase hace un load de la URL y añade un Listener ADD_TO_STAGE.
Cuando se ha cargado la imagen, dispatcha un evento.
En Main, capturamos ese evento y es ahí donde añadimos al stage el objeto img. Vamos

Código ActionScript :

/****Nuestra Clase Image****/
package  
{
   import flash.display.MovieClip
   import flash.display.Loader
   import flash.events.Event;
   import flash.net.URLRequest;
        public class Images extends MovieClip  
        {  
     private var mc:MovieClip = new MovieClip();  

     private var _w:int;
     private var _h:int;
     private var _x:int;
     private var _y:int;
  
         public function Images(url:String,_w:Number=0,_h:Number=0,_x:Number=0,_y:Number=0){  
                this._x = _x;
           this._y = _y;
           this._w = _w;
           this._h = _h;
                var ldr:Loader = new Loader();  
                ldr.load(new URLRequest(url));  
//   Añadimos el evento al loader
                ldr.contentLoaderInfo.addEventListener(Event.INIT, onLoadInit); 
//   Añadimos el evento ADDED_TO_STAGE
           addEventListener(Event.ADDED_TO_STAGE,onStage) 
         }  
         private function onStage(e:Event):void { 
          removeEventListener(Event.ADDED_TO_STAGE, onStage);
               var obj:Object = new Object();   
               obj.mc = mc;   
               obj.alpha = 50;   
               obj.ratio = 170;   
               obj.distance = 0;   
               obj.updateTime= -1;   
               obj.reflectionDropoff = 70;   
               var r1:Reflect = new Reflect(obj);   
            } 
            private function onLoadInit(e:Event):void {
               var ldr:Loader = e.target.loader as Loader
               ldr.contentLoaderInfo.removeEventListener(Event.INIT, onLoadInit); 
               if (_w!=0){
          ldr.width = _w;  
               }
               if (_h!=0){
          ldr.height = _h;
              }
              ldr.x = _x;
              ldr.y = _y;
              mc.addChild(ldr);
               addChild(mc);
// Cuando se ha cargado, "dispatchamos" un evento
               dispatchEvent(new Event(Event.INIT));
           }  
     }  
}

Así, nuestra Clase de documento queda como:

Código ActionScript :

package  
{
   import flash.display.MovieClip;
   import flash.events.Event;
   
   public class Main extends MovieClip 
   {
      
      public function Main()  
      {
         var img:Images = new Images("foto_1_1.jpg",250,150);
         img.addEventListener(Event.INIT, imgLoaded);
      }
      private function imgLoaded(e:Event):void {
         var img:MovieClip = e.target as MovieClip;
         img.removeEventListener(Event.INIT,imgLoaded)
         addChild(img);
      }
   }
}

Si no queremos clase de documento, como siempre, en el primer frame de nuestra película flash

Código ActionScript :

var img:Images = new Images("foto_1_1.jpg",250,150);
img.addEventListener(Event.INIT, imgLoaded);

private function imgLoaded(e:Event):void {
   var img:MovieClip = e.target as MovieClip;
   img.removeEventListener(Event.INIT,imgLoaded)
   addChild(img);
}

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 02 Oct 2009 10:39 am
Otra opción: pasándole como argumento dónde queremos que se añada:

Código ActionScript :

package  
{
   import flash.display.MovieClip
   import flash.display.Loader
   import flash.events.Event;
   import flash.net.URLRequest;
   import flash.display.DisplayObjectContainer

public class Images extends MovieClip  
{  
   private var mc:MovieClip = new MovieClip();  

   private var _w:int;
   private var _h:int;
   private var _x:int;
   private var _y:int;
   private var _root:DisplayObjectContainer;
  public function Images(_root:DisplayObjectContainer,url:String,_w:Number=0,_h:Number=0,_x:Number=0,_y:Number=0){  
       this._x = _x;
      this._y = _y;
      this._w = _w;
      this._h = _h;
      this._root = _root;
       var ldr:Loader = new Loader();  
       ldr.load(new URLRequest(url));  
       ldr.contentLoaderInfo.addEventListener(Event.INIT, onLoadInit); 
      addEventListener(Event.ADDED_TO_STAGE,onStage) 
  }  
  private function onStage(e:Event):void { 
     removeEventListener(Event.ADDED_TO_STAGE, onStage);
   var obj:Object = new Object();   
   obj.mc = mc;   
   obj.alpha = 50;   
   obj.ratio = 170;   
   obj.distance = 0;   
   obj.updateTime= -1;   
   obj.reflectionDropoff = 70;   
   var r1:Reflect = new Reflect(obj);   
} 
  private function onLoadInit(e:Event):void {
   var ldr:Loader = e.target.loader as Loader
   ldr.contentLoaderInfo.removeEventListener(Event.INIT, onLoadInit); 
   if (_w!=0){
      ldr.width = _w;  
   }
   if (_h!=0){
      ldr.height = _h;
  }
  ldr.x = _x;
  ldr.y = _y;
   mc.addChild(ldr);
   addChild(mc);
   _root.addChild(this);
    
  }  
}  
}

Y, nuestra "Main" quedaría como, p.e.

Código ActionScript :

//si la queremos añadir directamente en la película principal, usamos "this"
var img:Images = new Images(this, "foto_1_1.jpg", 250, 150);

//si la queremos añadir en un MC cualquiera,usaremos "mc"
var mc:MovieClip = new MovieClip();
var img2:Images = new Images(mc, "foto_1_2.jpg", 250, 150);
addChild(mc);

Por Eliseo2

710 de clabLevel



 

firefox

 

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