Comunidad de diseño web y desarrollo en internet online

Comunicar Clases

Citar            
MensajeEscrito el 04 Feb 2010 05:01 pm
Hola!!!
Tengo un MC como boton, necesito que al darle Click dispare un evento que afecta a otro MC y esta en su respectiva clase, esto tengo hasta ahora pero no me funciona:

clase del Mc que actua como boton:

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();
      import clases.Todo;
       addEventListener(MouseEvent.MOUSE_OVER,si);  
       addEventListener(MouseEvent.MOUSE_OUT,no); 
       addEventListener(MouseEvent.CLICK,encima); 
      }  
        
      private function si(evt:MouseEvent):void{  
       (evt.target).gotoAndStop(2); 
      } 
     
     private function no(evt:MouseEvent):void{  
       (evt.target).gotoAndStop(1); 
      } 
     
     private function encima (evt:MouseEvent):void{ 
        Todo(root).Desenfocar(); 
     } 
   }  
} 


clase del Mc sobre el que se haria la accion:

Código ActionScript :

package clases{  
 
   import flash.display.MovieClip;  
   import flash.events.Event; 
   import flash.filters.BlurFilter; 
     
   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; 
      }  
   }  
}


Alguien me podria colaborar?
Gracias

Por dianita666

Claber

185 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Feb 2010 06:09 pm
Diana, tienes algún que otro concepto "bailando".
Los métodos se aplican a objetos, los objetos son los que derivan de una clase. En las clases es donde definimos los métodos.
Por ejemplo. cuando tenemos un MovieClip con nombre de instancia "mimc", lo que tenemos es un objeto "mimc" de la Clase MovieClip.
Por eso hacemos

Código ActionScript :

mimc.gotoAndPlay(3)

pero NO

Código ActionScript :

//Error de concepto
MovieClip.gotoAndPlay(3)


Vale, supongo que en tu película tienes un MC (voy a suponer que su nombre de instancia es "mimc") que deriva de la Clase Todo, y un MC (voy a suponer que su nombre de instancia es "miboton") que deriva de la Clase Web.

Lo que quieres es que "miboton" actúe sobre "mimc". Para ello debemos hacer que "miboton" tenga una referencia de "mimc".
el modo de conseguirlo es que tu Clase "Web" tenga una variable. La voy a hacer pública para hacerlo más sencillo. Así reescribimos tu Clase Web

Código ActionScript :

package clases{   
  
   import flash.display.MovieClip;   
   import flash.events.Event;  
   import flash.events.MouseEvent;  
      
   public class Web extends MovieClip {   
      //<---añadimos aquí la variable
      public mc:Todo;  //<--y le decimos que es de la Clase Todo   
      public function Web(){ 
          ....
     }
     .....
     //En tu función "encima" es esa variable "mc" la que "desenfoca"
     private function encima (evt:MouseEvent):void{  
        mc.Desenfocar();  
     }
}

Ahora sólo queda que, en tu película principal escribas

Código ActionScript :

miboton.mc=mimc


Vale, es muy rápido, lo suyo sería que la variable fuera privada y hacer una función setter y getter, pero quiero que quede claro que es a un objeto al que le ejecutas el método

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Feb 2010 06:44 pm
Lo coloque asi :

Código ActionScript :

package clases{   
  
   import flash.display.MovieClip;   
   import flash.events.Event;  
   import flash.events.MouseEvent;  
      
   public class Web extends MovieClip {  
   public var accion:Todo; 
         
      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 (evt:MouseEvent):void{  
        accion.Desenfocar();  
     }  
   }   
}  



Y me da este error al darle click al MC:

Código ActionScript :

TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
   at clases::Web/encima()

Por dianita666

Claber

185 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Feb 2010 07:45 pm
como te dijo Eliseo en la pelicula principal o mejor aun la clase[ Main o Document Class] debes de conectar la variable "accion" que solamente esta "declarada" , esta variable la conectas con el "objeto" de la clase "Todo" que ya debe existir en el escenario.

Código ActionScript :

objetoWeb.accion = objetoTodo;


Jonathan

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

chrome
Citar            
MensajeEscrito el 04 Feb 2010 07:53 pm
pero como hago si de Document Class tengo un Preload que hicve con un tuto

este es le preload:

Código ActionScript :

package clases{
   
   import flash.display.Stage;
   import flash.display.MovieClip;
   import flash.display.Shape;
   import flash.text.TextField;
   import flash.events.*

   
   public class Precarga extends MovieClip{
      
      private var texto:TextField;
      private var marco:Shape;      
      private var barra:Shape;
      //----------------------------------------
     
      public function Precarga (){
       stop(); 
         dibujaPreload();
         posicionaPreload();
         this.loaderInfo.addEventListener(ProgressEvent.PROGRESS, onLoadProgress);
         this.loaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);      
         //----------------------------------------
       
         function onLoadProgress (event:ProgressEvent):void{
          
            var cargado:int = event.bytesLoaded;
            var total:int = event.bytesTotal;
            var porcentaje:int = cargado/total*100;
            texto.text = "Cargado: "+String(porcentaje)+"%";
            barra.width = porcentaje*marco.width/100;
         }
       
         //----------------------------------------
         function onLoadComplete (event:Event):void{
          
            removeChild(texto);
            removeChild(marco);
            removeChild(barra);
            nextFrame();
         }
      }

      //----------------------------------------
      public function dibujaPreload() {
        
         texto = new TextField();
         marco = new Shape();
         barra = new Shape();
         marco.graphics.lineStyle(1, 0x000000);
         marco.graphics.drawRoundRect(0, 20, 70, 5, 0);
          barra.graphics.beginFill(0x000000);
          barra.graphics.drawRect(0, 20, 70, 5);
          barra.graphics.endFill();   
         addChild(texto);
         addChild(marco);
         addChild(barra);
      }
     
      //----------------------------------------
      public function posicionaPreload() {
         texto.x = marco.x = barra.x = stage.stageWidth /2 - marco.width /2
         texto.y = stage.stageHeight /2 - texto.height /2
         marco.y = barra.y = texto.y + 5
      }
   }
}

Por dianita666

Claber

185 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Feb 2010 08:14 pm
Gracias,
ya lo resolvi

Por dianita666

Claber

185 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Feb 2010 09:55 pm
Hola diana, a lo mejor no estás muy familiarizada con esto que te voy a decir, pero podrías utilizar la función EventDispatcher(), para crear que tu aplicación genere un nuevo evento al pasar por esta línea.

por ejemplo, esto fue lo que utilicé en uno de mis proyectos.

Esta es mi clase de evento

Código ActionScript :

package clases.events
{
   import flash.events.Event;

   public class MyFileEvent extends Event
   {
      private var datos:Array;
      public static const ARCHIVO:String = "ARCHIVO";
      
      public function MyFileEvent(type:String, data:Array, bubbles:Boolean=false, cancelable:Boolean=false)
      {
         super(type, bubbles, cancelable);
         datos = data;
      }
      
      public function get data():Array{
         return datos;
      }
   }
}


Dentro de otra clase importo la clase MyFileEvent que hice anteriormente y genero un nuevo evento.

Código ActionScript :

import clases.events.MyFileEvent;
.....
 private function selectHandler(event:Event):void {
           ...
            var datos:Array = new Array();            
            dispatchEvent(new MyFileEvent(MyFileEvent.ARCHIVO, datos));
}


posteriormente hago un listener a ese objeto de la clase para que escuche el evento que esta va a disparar

Código ActionScript :

addEventListener(MyFileEvent.ARCHIVO, selectedFiles);

private function selectedFiles(e:Event):void{
      //de esta manera podemos acceder al arreglo que declaramos en nuestra clase MyFileEvent
      e.data;
}


Como puedes ver su uso es sencillo y la programación está más estructurada.

Saludos...
P.

Por pmolina88

74 de clabLevel



Genero:Masculino  

Ingeniero en Sistemas

firefox

 

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