Comunidad de diseño web y desarrollo en internet online

Problema profundidad de movieclip

Citar            
MensajeEscrito el 06 Feb 2010 02:48 am
Hola!!!
espero que me puedan colaborar con lo siguiente:

Tengo un boton que al ser oprimido llama dos eventos separados (public function) que estan en una misma clase: Uno es un desenfoque del propio Movieclip y el otro es un load de un swf externo,
la cosa es que carga el swf externo dentro del MC que ha sido desenfocado.

¿Como puedo indicarle a la carga que se coloque encima de dicho movieclip, para que el desenfoque no lo afecte?

esta es la clase con los dos eventos:

Código ActionScript :

package clases{  
 
   import flash.display.MovieClip;  
   import flash.events.Event; 
   import flash.filters.BlurFilter;
   import flash.net.URLRequest;
   import flash.display.Loader;
     
   public class Todo extends MovieClip {  
        
      public function Desenfocar(){   
         addEventListener(Event.ENTER_FRAME,cambio);  
      }  
        
       private function cambio(event:Event):void{  
       var blur:BlurFilter = new BlurFilter(); 
       blur.blurX = 10;  
       blur.blurY = 10;  
       blur.quality = 5;  
       var filterArray:Array = new Array(blur);  
       this.filters = filterArray; 
      } 
    
    
   public function Apagar(){
    addEventListener(Event.ENTER_FRAME,apagado);
    }
    
    private function apagado(event:Event):void{
       this.mouseEnabled = false;
       this.enabled = false;
       this.mouseChildren = false;
    }
    
    //CARGAS
    public function Cweb(){   
         addEventListener(Event.ENTER_FRAME,Wsubir);  
      }  
        
       private function Wsubir(event:Event):void{  
       var contenedor = new Loader();
      contenedor.load(new URLRequest("prueba.swf"));
      addChild(contenedor);
      contenedor.setChildIndex(contenedor.getChildAt(-1),0) 
      } 
   }  
}

Les agradezco su atencion

Por dianita666

Claber

185 de clabLevel



 

firefox
Citar            
MensajeEscrito el 06 Feb 2010 02:21 pm
Dado que usas this para el filtro, estás afectando a toda la clase, es decir cualquier addChild que hagas heredará el filtro. Puedes aplicar el filtro a algún elemento en vez de a toda la instancia o hacer la carga en otra clase

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 07 Feb 2010 12:48 am
lo hice con el nombre de instancia del MC y no funciono

Por dianita666

Claber

185 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Feb 2010 01:00 am
optimiza un poco el codigo , por cada metodo que tienes activas un ENTER_FRAME , al hacer eso lo que provocas es que se ejecute codigo cada frame , en el caso de la funcion que carga el swf estarias cargando n swfs cada frame asi lo que vas a provocar es una aplicacion lenta.

Jonathan

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

firefox
Citar            
MensajeEscrito el 07 Feb 2010 01:10 am
¿Como hago para poner varias funciones en el mismo ENTER_FRAME?

Por dianita666

Claber

185 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Feb 2010 01:15 am
ps si tienes por ejmplo :

Código ActionScript :

private function miEnterFrame(e:Event):void
{
  //solo invoca o llama las funciones por su nombre
  miUpdate();
  otroMetodo();
  //...
}

private function miUpdate():void
{
  trace("call miUpdate()");
}

private function otroMetodo():void
{
  trace("call otroMetodo()");
}


esas funciones se ejecutarias cuando activaras el enter_frame, por lo regular debe haber un momento en el que por medio de alguna condicion removerlo hay que decirle que deje de ejecutarse , esto no es siempre solo en algunas cosas.

Jonathan

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

firefox
Citar            
MensajeEscrito el 07 Feb 2010 01:28 am
pero si pongo esas funciones como PRIVATE no me deja ejecutarlas desde otras clases

Por dianita666

Claber

185 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Feb 2010 01:30 am
ponlas publicas.

Jonathan

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

firefox
Citar            
MensajeEscrito el 07 Feb 2010 01:45 am
pues la verdad no entiendo, se supone qye el listener lleva el nombre de la funcion:

Código ActionScript :

 addEventListener(Event.ENTER_FRAME,apagado);

Por dianita666

Claber

185 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Feb 2010 01:59 am
Diana , mm digamoslo asi las funciones que responden a los listeners deben de ser privadas , por que estos listeners escuchan eventos de su misma clase , pero si tu lo que quieres es acceder una funcion de una clase que responde a un listener debes pasar un parametro ya que las funciones que responden a los listeners tienen esta estructura (event:TipoEvento):void , ahora supongamos que tienes una clase A y una clase B , A tiene una funcion que responde a un listener ENTER_FRAME y desde la clase B quieres acceder a el.

claseA

Código ActionScript :

public function miEnterFrame(e:Event):void
{
  trace("soy un evento enter_frame de la clase A");
}


claseB

Código ActionScript :

public function llamarEnterFrameA():void
{
  //le pasamos un parametro en este caso null, nos sirve
  instanciaA.miEnterFrame(null);
}


estoy usando linux asi que puede tener errores el codigo, al menos en las funciones que responden a los listeners de MouseEvent pasando null como parametro funciona bien.

Jonathan

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

firefox
Citar            
MensajeEscrito el 07 Feb 2010 02:22 am
lo intente como crei entenderlo pero no funciono,
¿Podrias darme un ejemplo aplicado a mi codigo?

este es el code del boton que llama las funciones externas:

Código ActionScript :

package clases{  
 
   import flash.display.MovieClip;  
   import flash.events.Event; 
   import flash.events.MouseEvent; 
     
   public class Web extends MovieClip { 
        
      public function Web(){   
       stop();
       addEventListener(MouseEvent.MOUSE_OVER,si);  
       addEventListener(MouseEvent.MOUSE_OUT,no); 
       addEventListener(MouseEvent.CLICK,encima); 
      }  
        
      private function si(event:MouseEvent):void{  
       gotoAndStop(2); 
      } 
     
     private function no(event:MouseEvent):void{  
       gotoAndStop(1); 
      } 
     
     private function encima (event:MouseEvent):void{ 
       Todo(parent).Desenfocar();
      Todo(parent).Apagar();
      Todo(parent).Cweb();
     } 
   }  
}

Por dianita666

Claber

185 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Feb 2010 02:34 am
primero hay que optimizar el code de la clase Todo mas o menos asi :

Código ActionScript :

package clases 
{   
  
   import flash.display.MovieClip;   
   import flash.events.Event;  
   import flash.filters.BlurFilter; 
   import flash.net.URLRequest; 
   import flash.display.Loader; 
   
   
   public class Todo extends MovieClip 
   {
    //los declaro globales a nivel de esta clase "local"
    private var blur:BlurFilter;
    private var filterArray:Array;
    private var contenedor:Loader;
   
    public function Desenfocar()
    {
   blur = new BlurFilter();
   blur.quality = 5;
   filterArray = new Array(blur);
   addEventListener(Event.ENTER_FRAME,cambio);   
    }   
         
    private function cambio(event:Event):void
    {   
      //hacemos una animacion pero para eso comprobamos el valor actual de
      //la propiedad blurX y blurY de el filtro
      if(blur.blurX <= 10) {
   //mienstras sea menor o igual a 10 aumentamos su valor , en aumentos de 1 , este valor es opcional
   blur.blurX = blur.blurY += 1;
   this.filters = filterArray;
      }else {
   //si ya tiene un valor mayor del no deseado hay que remover este listener si no seguira consumiendo memoria
   removeEventListener(Event.ENTER_FRAME, cambio);
   }   
     }  
     
     
    public function Apagar()
    {
      //esta funcion solo va a inabilitar algunas propiedades asi que no es necesario otro enter_frame
      //pero si quieres que el blur se quite activa una animacion en retroceso para lograr un mejor efecto visual
      this.mouseEnabled = false; 
      this.enabled = false; 
      this.mouseChildren = false; 
      addEventListener(Event.ENTER_FRAME,apagado); 
    } 
     
    private function apagado(event:Event):void
    { 
       if(blur.blurX != 0) {
     blur.blurX = blur.blurY -= 1;
     this.filters = filterArray;
   }else {
     //logramos llevar el valor  de 10 a 0 entonces ya no lo ocupamos asi que removemos
     removeEventListener(Event.ENTER_FRAME, apagado);
      }
    } 
     
    //CARGAS 
    public function Cweb()
    {
      //no es necesario el listener asi que solo pondremos el codigo que tenias
      contenedor = new Loader();
      contenedor.load(new URLRequest("prueba.swf"));
      //ojo estas agregando a tu misma clase , pasaria hacer parte de la displayList de esta clase
      addChild(contenedor)
      contenedor.setChildIndex(contenedor.getChildAt(-1),0)
    }    
  }   
} 


asi seria mas o menos , lamento que el codigo no paresca legible pero no tengo Flash a la mano.

Jonathan

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

firefox

 

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