Comunidad de diseño web y desarrollo en internet online

Acceder a metodo de una variable creada dinamica

Citar            
MensajeEscrito el 02 Feb 2009 03:57 am
Disculpen por el titulo, no se si sea entendible.

Tengo algunas variables creadas dinamicamente desde una clase del tipo movieclip( extends MovieClip), a su vez, estas varibles son instancias de otra clase tambien del tipo movieclip, la creacion la hago en un for:

Código :

         for (i = 1; i <= 3; i++)
         {
            this.casilla_btn = new CCasilla(_x,_y);
            this.casilla_btn.name = "c" + i;
            this.addChild(casilla_btn);
         }


Todo bien, pero cuando quiero llamar a una variable o metodo de la clase CCasilla por medio de los nombres de las variables creadas, no me deja..he intentado: this.getChildByName("c1").metodo o this.getChildAt(1).metodo. Obtengo como error:

escribió:

1119: Acceso a una propiedad disabled posiblemente no definida mediante una referencia con tipo estático flash.display:DisplayObject.


Cabe destacar, que tambien ya las he modificado como public static y nada.. Cosa rara, porque he checado que si llamo a una variable o metodo de la misma clase con e.currentTarget.variable o e.currentTarget.metodo en una funcion para manejar un evento generado por una de esas variables, si me deja (basta claro, que esten definidas como publicas).

Espero haberme dado a entender, que soy malo..
PD: Sorry, no tengo forma de poner acentos.

Por soullost

2 de clabLevel



 

opera
Citar            
MensajeEscrito el 02 Feb 2009 06:07 am
Hola, ya veo cuál es el problema… Está “fácil” pero no es obvio… El método “getChildByName” te regresa un objeto de la clase Objeto… (que es lo más más genérico dentro de ActionScript),y pues la clase Objeto no tiene el método que quieres usar. :-) Es decir:
- getChildByName regresa un objeto…
- Los objetos en flash tienen ciertos métodos por default… y si le pides un método que no tiene, pues no lo encuentra.

¿La solución?… Hacer una cosa que se llama “casting”…

Intenta esto:
CCasilla(this.getChildByName(”c1″)).metodo

Básicamente le estamos diciendo a Flash que lo que te regresa getChildByName no es solo un objeto, sino que es un objeto de tipo CCasilla, y ya encontrará los métodos adecuados. :-)

---
Héctor Padilla
http://www.shiftf12.net

Por elhector

0 de clabLevel



 

chrome
Citar            
MensajeEscrito el 02 Feb 2009 07:29 am
Gracias!, ha funcionado de maravilla (aunque, solamente por medio de un método).

Un poco de código para que sea más compresible.

Clase: CTablero

Código :

package classes
{
   import ...
   
   public class CTablero extends MovieClip
   {
      private var casilla_btn:CCasilla;

      function CTablero()
      {
         

         dibujaCasillas();

         for(var i:int = 1; i <= 9; i++)
         {

            this.getChildAt(i).addEventListener(MouseEvent.MOUSE_DOWN,dibujaJugada)
         }
         
         // Comienza jugador 1
         jugador = 1;
      
      }
            
      public function dibujaCasillas()
      {
         ...
         for (i = 1; i <= 3; i++)
         {
            this.casilla_btn = new CCasilla(_x,_y);
            this.casilla_btn.name = "c" + i;
            this.addChild(casilla_btn);
            _x+=70;
         }
      }
      
      public function dibujaJugada(e:Event):void
      {
         if(this.jugador == 1)
         {
            if(e.currentTarget.dibuja(this.jugador))
            {
               trace("entra");
               this.jugador = 2;
            }
         }
         ...
      }
      
      private function verifica():Boolean
      {

         return CCasilla(this.getChildAt(1)).verEstado();
      }
      
   }
} 


Clase: CCasilla

Código :

package classes
{
   import ...
   
   public class CCasilla extends MovieClip
   {
      ...
      private var disabled:Boolean = false;
      
      function CCasilla()
      {}

      public function dibuja(jugador:int):Boolean
      {
         ...
      }
      public function verEstado():Boolean
      {
         return disabled;
      }
   }
}


Así es como funciona, haciendo el casting con el método. Pero, ¿por qué no funciona si trato de acceder a una variable miembro de CCasilla (declarada como public static)?. Lo hago igual, de la forma: return CCasilla(this.getChildAt(1)).disabled;, y marca:

Error escribió:

1119: Acceso a una propiedad disabled posiblemente no definida mediante una referencia con tipo estático classes:CCasilla.


Offtopic. Tengo otras dudas (de hecho, muchas xD).

¿Qué diferencia existe en usar la propiedad .name y hacerlo de la forma this["nombre"] = new Clase(); ?

¿Por qué se puede acceder directamente a los métodos y variables miembro de CCasilla con e.currentTarget.dibuja(this.jugador)? He leído la documentación, y dice (según entendí) que lo que hace currentTarget es retornar el objeto desde donde ha sido llamado el evento, supongo que es por eso. Alguien que me aclare un poco más..

Vengo de usar lenguajes de más bajo nivel, como C/C++, y se me hace muy raro la forma de trabajar de AS. No sería mejor declarar una matriz de una clase y hacer referencia a cada objeto mediante su correspondiente índice. ¿Se puede?.

No es necesario que respondan todas las preguntas, pero me serviría de mucho y estaría más que agradecido.

Saludos.

Por soullost

2 de clabLevel



 

firefox
Citar            
MensajeEscrito el 02 Feb 2009 08:13 am
En primer lugar, NO puedes acceder directamente a la propiedad "disableD2 porque la has declarado private

Código ActionScript :

//si la hace pública
public var disabled:Boolean = false;

Puedes acceder a ella directamente en lugar de a través de un método "público". Si hubieras escrito, p.e.

Código ActionScript :

private function verEstado():Boolean
      {
         return disabled;
      }

NO se podría acceder al método, vamos te daría error

Código ActionScript :

CCasilla(this.getChildAt(1)).verEstado(); //<--error, verEstado es "private"


Sobre la propiedad "name" es cierto que hay confusión (provocada por cómo funcionaba antes Flash) Partamos de una base: la propiedad "name" SÓLO sirve para acceder a los MCs mediante getChildByName, así que, tal y como planteas, lo que se suele hacer es tener unas variables que hagan "referencia" a los MCs. Si escribes

Código ActionScript :

this["nombre"]=new Clase()

Lo que estás haciendo es crear una variable llamada "nombre" que hace referencia al objeto recién creado. Igualmente puedes, si tienes muchas variables, meterlas en un array

Código ActionScript :

misCasillas=new Array()
misCasillas[0]=new Clase();
misCasillas[1]=new Clase();

De hecho eso es lo recomendable.

Sobre lo de e.currentTarget es algo más complicado de entender. Flash normalmente, cuando se disparan los eventos manda como argumento un objeto de la Clase Evento. (por eso se recogen en la función). De entre las propiedades del evento están target y currentTarget y según el evento sea bubleable y en la fase en que se encuentre usamos una u otra. puff, mejor que te lo expliquen Rich Shupe and Zevan Rosser

Por Eliseo2

710 de clabLevel



 

firefox

 

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