Comunidad de diseño web y desarrollo en internet online

[AS3]Pregunta sobre variables y clases.

Citar            
MensajeEscrito el 09 Mar 2011 01:37 am
Hola, tengo una duda sobre variables y como pueden interactuar entre clases.

Tengo una clase Main que contiene la variable score, y otra clase llamada Click, que cada vez que yo ago click en un circulo me deberia dar + 1 de score.

Clase Main:

Código :

package 
{
   import flash.display.MovieClip;
   import flash.text.TextField;
   
   /**
    * ...
    * @author nico
    */
   public class Main extends MovieClip 
   {
      
      public var scoreText:TextField = new TextField();
      public var score:int = 0;
      
      public var clickCircle:Click = new Click();
      
      public function Main()
      {
         scoreText.text = "Score: " + score;
         scoreText.selectable = false;
         scoreText.border = true;
         
         clickCircle.graphics.beginFill(0x000000);
         clickCircle.graphics.drawCircle(0,0,16);
         
         
         addChild(scoreText);
         
         addChild(clickCircle);
         clickCircle.x = 150;
         clickCircle.y = 100;
      }
      
   }
   
}


La clase Click:

Código :

package 
{
   import flash.display.MovieClip;
   import flash.events.Event;
   import flash.events.MouseEvent;
   
   /**
    * ...
    * @author nico
    */
   public class Click extends MovieClip 
   {
      
      
      public function Click()
      {
         addEventListener(MouseEvent.CLICK, clickThis);
      }
      
      public function clickThis(e:MouseEvent):void
      {
         score++; // Esto no sirve porque me dice acces of undefined property.
         
                        trace("Click");
      }
      
   }


Me tira error obiamente porque nunca cree la variable score dentro de la clase Click, lo hize en la clase Main, por eso quiero que la variable score este dentro de main y que el score cambia dentro de la clase click. La clase Main muestra el score.

En punto quiero que entre clases algunas variables sean globales, y que cualquier clase la pueda cambiar.

Gracias.

Por Aethernum

6 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 Mar 2011 02:11 am
Si empiezas a trabajar con clases supongo que es porque quieres trabajar orientado a objetos en un nivel mas avanzado. Para ello olvidate de las variables globales, ahora existen clases y propiedades. Para acceder a una propiedad pública de la clase A desde la clase B (suponiendo que B contenga una instancia de A o tenga una referencia a ella) haces

instanciaA.score++

Usar variables globales rompe la encapsulación ... y el sentido mismo de usar clases

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 Mar 2011 02:30 am
La clase B no tiene una referencia a la variable de la clase A, como hago eso.

Y si quiero aprender programacion orientada a objetos, por eso estoy ocupando clases.

Como se hace una referencia a una variable que se encuentra en la clase A.?

Por Aethernum

6 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 Mar 2011 10:51 am
A través de una instancia. En flash usualmente las instancias tienen un nombre. Aquí un ejemplo simple:

var instancia:A = new A();
var instanciaB = new B();

Aquí ambas comviven en el mismo scope y usas los nombres de instancia. Para estudiar OOP puedes mirarte algunos de los libros y enlaces de este post http://foros.cristalab.com/libros-y-tutoriales-sobre-actionscript-3-t41832/

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 14 Mar 2011 10:30 am
Aether, Lo que trata de decirte Jorge es que no es muy "ortodoxo" lo que estás haciendo. Estás haciendo que la clase Click dependa de dónde exista el elemento click.

Siendo "ortodoxos", tanto el addEventListener, como la función "clickThis" la tendrías que poner en la función Main

Código ActionScript :

//en tu función Main
clickCircle.addEventListener(MouseEvent.CLICK, clickThis);
private void function clickThis(e:MouseEvent){
   ....
}

También podrías dispatchar un evento personalizado en la Clase Click y recogerlo en la función Main

Código ActionScript :

//En tu Clase
public function Click()
      {
         addEventListener(MouseEvent.CLICK, clickThis);
      }
      
      public function clickThis(e:MouseEvent):void
      {
       //Lanzamos un evento Personalizado
      dispatchEvent(new Event("PERSONAL"))
                        trace("Click");
      }

En tu función Main, recogeríamos ese evento

Código ActionScript :

//en tu función Main
clickCircle.addEventListener("PERSONAL", clickThis);
private void function clickThis(e:MouseEvent){
   ....
}


Vale, si no quieres ser ortodoxo, te puedes referir a Main desde la Clase Click con MoiveClip(parent) siempre que hayas hecho el addChild

Código ActionScript :

//En tu clase
public function clickThis(e:MouseEvent):void
      {
         MovieClip(parent).score++; 
                        trace("Click");
      }

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 14 Mar 2011 07:14 pm
Bien como decía solisarg, en AS3 ya no existen las variables globales en, algo que al principio nos parecía muy bien en AS2 pero que viéndolo desde el punto de vista de programación no es algo que esté correcto.
Usando programación un poquito más avanzada (herencia) tendrías que poner que poner en la clase padre que en este caso sería Main

Código ActionScript :

protected var score:int = 0;

Esto te garantiza que el atributo score se herede a las clases que sean hijas de Main, por lo tanto dichas clases lo pòdrán modificar.
Posteriormente en la clase Click pondrías lo siguiente

Código ActionScript :

public class Click extends Main {      
...      
      public function clickThis(e:MouseEvent):void
      {
         super.score++;
         trace("Click");
      }
}

Las sintaxis de AS3 son muy parecidas a las de Java, por lo tanto para acceder al atributo de la clase padre pondríamos super.(atributo protegido)
Si te das cuenta la clase Click no hereda ahora de movieclip, sino de la clase Main, que es a su vez esta tambien hereda de MovieClip.
Con esto tu problema se soluciona, pero te recomiendo que estudies un poco de programación orientada a objetos para que entiendas un poco más de lo que es la herencia.

Saludos y espero que hayas aprendido algo :wink:

Por pmolina88

74 de clabLevel



Genero:Masculino  

Ingeniero en Sistemas

firefox
Citar            
MensajeEscrito el 16 Mar 2011 08:46 am
Pmolina, tengo la impresión de que tu código no funcionará (si funciona sí que es algo extraño). Ese

Código ActionScript :

super.score++

No me gusta nada porque un objeto de la clase "Click" no sabe nada de un objeto de la clase "Main" (so pena que la clase Main fuera estática)

Por Eliseo2

710 de clabLevel



 

firefox

 

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