Comunidad de diseño web y desarrollo en internet online

Acceder a un movieclip desde una clase en as3

Citar            
MensajeEscrito el 04 Sep 2008 11:04 am
hola compañeros,

Tengo un problema en as3, haber si me podeis hechar una mano.
En mi archivo .fla tengo un MC con el nombre de instancia "uno_btn"
el codigo lo tengo en main.as (q es el documentClass)

Si desde la clase del docuemnto hago:
uno_btn.gotoAndStop("parado"); //funciona perfectamente

pero si vincula una clase al clip "uno_btn" y pongo el siguiente codigo dentro de ella:
MovieClip(parent).uno_btn.gotoAndStop("parado");

Me tira 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.
Alguien sabe como hacer referencia a un MC desde una clase que no sea la clase del documento :( ?

Si hago referencia asi:
this.gotoAndStop("parado"); //si funciona

pero si necesito hacer referencia a otro boton que no se el actual this NO me sirve.

Por oscarlosan

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Sep 2008 11:38 am
Si una clase asociada a un botón debe manejar otro botón distinto de this, lo que tienes es un problema de estructura. Tienes que manejar tus botones desde una clase que "vea" a todos los botones

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 05 Sep 2008 11:59 am
gracias por tu respuesta, supongo que no se estructrurar bien las clases.
Te pongo un ejemplo, haber si me puedes ayudar:

Código :

package com {  
    import flash.display.*;  
    import flash.events.*;  
     
    public class Boton extends MovieClip {  
                             
        public function Boton () { 
              this.buttonMode = true;  
                           this.addEventListener(MouseEvent.CLICK, onClick);  
            this.addEventListener(MouseEvent.MOUSE_OVER, onOver);  
            this.addEventListener(MouseEvent.MOUSE_OUT, onOut);
        }
                
        function onOver(event:Event):void {
              this.gotoAndPlay("entrar");
        }
        
        function onOut(event:Event):void { 
              this.gotoAndPlay("salir");
        }
                  function onClick(event:Event):void {        

                  }
}


La clase No quiero que esta vinculada al boton.

Ahora desde la clase del documento:
private var boton:Boton = new Boton(uno_btn);

esta seria la forma de añadir un comportamiento general a un boton?
Como modifico la clase Boton para que el contructor me coja el boton que le he pasado?
He probado con:
...
public function Boton (btn:MovieClip) {
btn.buttonMode = true;
btn.addEventListener(MouseEvent.CLICK, onClick);
...

Pero me tira el error de siempre :( :
TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
at com::Boton$iinit()
at Main$iinit()

Otra pregunta como haria para deshabilitaria el boton en la clase Boton cuando hacemos click sobre el boton.

Gracias por tu ayuda.

Por oscarlosan

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 05 Sep 2008 01:05 pm
Selecciona el botón en la biblioteca, click derecho y donde dice class le pones com.Boton (intenta armar un package que refleje tu dominio, no el genérico com) Luego una especie de attachMovie que en AS3 es

addChild(new Boton())

Automáticamente la instancia se asocia con la 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 05 Sep 2008 01:21 pm
addChild(new Boton());

lo pongo en Boton.as o en la clase del documento?

private var boton:Boton = new Boton(uno_btn); //supongo que esto ya no hace falta ponerlo

Como hago para deshabilitar el btn?

Por oscarlosan

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 05 Sep 2008 01:29 pm
el boton "uno_btn" esta en el stage o sea que NO se pq tengo que hacer:
addChild(new Boton())

Todos mis botones ya los tengo en el escenario y con nombres de instancia.

Por oscarlosan

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 05 Sep 2008 01:58 pm
Entonces solo asocia la clase al elemento, haciendo click derecho sobre el en la librería

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 05 Sep 2008 02:08 pm
Eso ya sabia hacerlo y me coge el comportamiento para todos mis botones. Pero que pasa cuando:
quiero deshabilitar alguno de ellos?
o volver a habilitar el que esta deshabilitado cuando pulso otro boton?

Por oscarlosan

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 05 Sep 2008 02:18 pm
El botón puede operar sobre si mismo, es decir puede hacer un this.enabled = false, pero para coordinar a todos los botones ya no puedes hacerlo desde la clase del botón, porque estructuralmente no le compete. En ese caso, tiene que haber una clase controladora que tenga referencia a todos los botones (porque los instancia con addChild o porque es la clase del documento) y que habilita/deshabilite los botones. Puedes hacer directamente instancia.enabled = false o poner un método en la clase botón que lo haga. Mejor aún: los botones pueden escuchar un evento de deshabilitar/habilitar (por ejemplo para que todos se habiliten), luego deshabilitas específicamente el clicado

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 05 Sep 2008 02:52 pm
this.addEventListener(MouseEvent.CLICK, onClick);
...
function onClick(event:Event):void {
this.enabled = false;
}
...

Esto no me deshabilita el boton.

tb he probado con esto pero tampoco funciona
//this.mouseEnabled = false;

Por oscarlosan

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 05 Sep 2008 03:48 pm
Ok, acá una clasecita para que empieces a probar. Armé el botón todo con code para que funcionara así tal cual está, pero luego ya lo vas modificando:

Código ActionScript :

package {  
    import flash.display.*;  
    import flash.events.*;  
   import flash.geom.ColorTransform;
     
    public class miBoton extends MovieClip {  
                             
        public function miBoton () { 
         graphics.lineStyle(1, 0xff0000)
         graphics.beginFill(0xff0000)
         graphics.drawRect(0, 0, 50, 20)
         graphics.endFill()
            buttonMode = true;  
            addEventListener(MouseEvent.CLICK, onClick);  
            addEventListener(MouseEvent.MOUSE_OVER, onOver);  
            addEventListener(MouseEvent.MOUSE_OUT, onOut);
        }
                
        function onOver(event:Event):void { 
         pinta(0xff00ff)
        }
        
        function onOut(event:Event):void {             
         pinta(0xff0000)            
        }
        function onClick(event:Event):void {
         deshabilita()
        }
      public function habilita()
      {
         pinta(0xff0000)
         enabled = true
            addEventListener(MouseEvent.CLICK, onClick);  
            addEventListener(MouseEvent.MOUSE_OVER, onOver);  
            addEventListener(MouseEvent.MOUSE_OUT, onOut);         
      }
      public function deshabilita()
      {
         pinta(0xcccccc)
         enabled = false
         removeEventListener(MouseEvent.CLICK, onClick);  
            removeEventListener(MouseEvent.MOUSE_OVER, onOver);  
            removeEventListener(MouseEvent.MOUSE_OUT, onOut);      
      }
      private function pinta(col:Number)
      {
            var transform:ColorTransform = new ColorTransform()
         transform.color = col
            this.transform.colorTransform = transform;      
      }
   }
}


Para agregar 10 instancias al escenario por ejemplo, en la línea de tiempo principal (o mejor en el contructor del Document Class)

Código ActionScript :

for(var i=0; i<10; i++){
   var bot:DisplayObject = this.addChild(new miBoton())
   bot.name = "bot"+i
   bot.x = 10
   bot.y = 10+(25 *i)
}


Jorge
for(var

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 05 Sep 2008 04:01 pm
Muchas gracias por tu tiempo, voy a probar la clase.

Por oscarlosan

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 08 Sep 2008 07:38 am
Ahora si quisiera ejecutar una funcion de la clase del documento para por ejemplo habilitar todos los botones?
Lo que quiero es que cuando pulse un boton habilite todos los botones y deshabilite el pulsado. De esta forma solo habra uno deshabilitado.
He estado haciendo pruebas con dispatchEvent para ejecutar una funcion desde otra clase pero no funciona. Solo funciona si la clase no esta vinculada a un clip.

Un ayudita por favor.

Por oscarlosan

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 08 Sep 2008 09:47 am
En el ejemplo como lo puse podría poner esto en la línea de tiempo principal, luego llamarlo dese el onPress del botón:

Código :

function deshabilitar(){
  for(var i:Number=0; i<10; i++)
   this.getChildByName("bot"+i).deshabilita()
}


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 08 Sep 2008 11:25 am
en el onpress de que boton? de uno del menu?
//en la clase del documento.
uno_btn.addEventListener(MouseEvent.CLICK, habilitar);
function habilitar(){
this.uno_btn.habilita();
}

//en Boton.as
public function habilita(){
enabled = true;
addEventListener(MouseEvent.CLICK, onClick);
addEventListener(MouseEvent.MOUSE_OVER, onOver);
addEventListener(MouseEvent.MOUSE_OUT, onOut);
}

me tira el siguiente error
ArgumentError: Error #1063: Discordancia del recuento de argumentos en Main/habilitar(). Se esperaba 0 y se obtuvo 1.

Creo que al final lo voy a poner todo en la clase del documento. Porque lo de separar en clases esta bien para un comportamiento comun a todos los botones, pero si quieres que un boton haga una cosa especifica diferente de los demas botones , Yo no consigo de ninguna manera hacerlo.

Se puede hacer los mismo pero el lugar de asociarlo al boton la clase?
-importamos la clase
-y añadir los comportamientos de la clase a un clip que ya esta en el stage (No creado por codigo)

Por oscarlosan

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 08 Sep 2008 02:42 pm
Para manejarlo desde afuera, quita primero el click desde dentro de la clase: addEventListener(MouseEvent.CLICK, onClick);
Luego manejalo desde fuera, siguiendo mi ejemplo

Código :

 for(var i:Number=0; i<10; i++)
   var bot:DisplayObject = addChild(new miBoton())
   bot.name = "bot"+i
   bot.addEventListener(MouseEvent.CLICK, handleBotones)
}
function handleBotones(evt:MouseEvent){
  for(var i:Number=0; i<10; i++)  this.getChildByName("bot"+i).habilita()
  evt.target.deshabilita()
}


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 09 Sep 2008 10:35 am
ok, voy a probarlo.

Por oscarlosan

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 Sep 2008 11:02 am
funciona:

Código :

for(var i:Number=0; i<10; i++)
   var bot:DisplayObject = addChild(new miBoton())
   bot.name = "bot"+i
   bot.addEventListener(MouseEvent.CLICK, handleBotones)
}
function handleBotones(evt:MouseEvent){
  for(var i:Number=0; i<10; i++)  this.getChildByName("bot"+i).habilita()
  evt.target.deshabilita()
}


//pero si añado esta linea a Boton.as

Código :

public function habilita() 
      { 
         pinta(0xff0000) 
         enabled = true 
            addEventListener(MouseEvent.CLICK, onClick);   
            addEventListener(MouseEvent.MOUSE_OVER, onOver);   
            addEventListener(MouseEvent.MOUSE_OUT, onOut); 
           gotoAndStop(1); <--- ESTA LINEA, SOLO FUNCIONA LAS 2 PRIMERAS VECES, DESPUES YA NO SALTA AL FTG 1, Y POR TANTO LOS BOTONES SE ME VAN QUEDANDO ENCENDIDOS (YA QUE TENGO BOTONES CON ANIMACION DE LINEA DE TIEMPO)
      } 
      public function deshabilita() 
      { 
         pinta(0xcccccc) 
         enabled = false 
         removeEventListener(MouseEvent.CLICK, onClick);   
            removeEventListener(MouseEvent.MOUSE_OVER, onOver);   
            removeEventListener(MouseEvent.MOUSE_OUT, onOut);       
      } 



Funciona todo a la perfeccion pero no se pq la 3ª vez que pulso un boton ya no funciona el gotoAndStop(1)

He probado con play();, gotoAndPlay(); y lo mismo.
He incluso lo he puesto la clase del documento asi:

Código :

for(var i:Number=0; i<10; i++)
   var bot:DisplayObject = addChild(new miBoton())
   bot.name = "bot"+i
   bot.addEventListener(MouseEvent.CLICK, handleBotones)
}

function handleBotones(evt:MouseEvent){
  for(var i:Number=0; i<10; i++){
       this.getChildByName("bot"+i).habilita()
       this.getChildByName("bot"+i).gotoAndStop(1)
  }
  evt.target.deshabilita()
}

y lo mismo. :(

Por oscarlosan

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 Sep 2008 11:06 am
//en el método deshabilita he puesto
this.gotoAndStop(this.totalFrames);

public function deshabilita()
{
this.gotoAndStop(this.totalFrames);
pinta(0xcccccc)
enabled = false
removeEventListener(MouseEvent.CLICK, onClick);
removeEventListener(MouseEvent.MOUSE_OVER, onOver);
removeEventListener(MouseEvent.MOUSE_OUT, onOut);
}

Por oscarlosan

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 Sep 2008 11:32 am
Supongo que habrás sacado pinta(0xff0000) y todas las cosas que puse en mi prueba y que no se adaptan a tu estructura ....

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 09 Sep 2008 11:37 am
si claro.
lo puse asi:

this["btn"+i].habilita();

ya que los botones(btn0, btn1, ...) los tengo en el escenario y No los añado a la lista de visualizacion por código.

Por oscarlosan

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 Sep 2008 12:03 pm
pinta está en la clase, estoy hablando de la clase, no del code en la línea de tiempo

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 09 Sep 2008 12:46 pm
si lo tengo modificado así:

function onOver(event:Event):void {
this.gotoAndPlay("entrar");
}
function onOver(event:Event):void {
this.gotoAndPlay("salir");
}

Por oscarlosan

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 Sep 2008 01:27 pm
Uff, sigue intentando

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 09 Sep 2008 02:08 pm
Lo dices pq a veces fallan este tipo de botones con gotoAndStop, ...
Bueno gracias.

Por oscarlosan

73 de clabLevel



 

firefox

 

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