2013-02-05 1 views
1

Bon, alors j'ai récemment essayé d'obtenir ma tête correctement autour de la POO dans AS3. En ce moment j'ai un scénario très simple où j'ai une classe, Paddle, qui dessine un rectangle. Dans ma classe de document, je crée deux instances de la classe Paddle, paddle1 et paddle2.Modification des propriétés de classe dans AS3

J'ai également créé une propriété pour ma classe Paddle dont je veux changer la couleur du rectangle qu'elle dessine. Je veux être en mesure d'ajuster cette propriété de la classe principale. Je sais que je pourrais le faire en passant des attributs lors de l'instanciation de la classe, mais il semble qu'une propriété serait un meilleur moyen, et maintenant je veux savoir si c'est la bonne façon de penser ou non.

classe principale:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 

    public class Engine extends Sprite 
    { 
     private var paddle1:Paddle = new Paddle(); 
     private var paddle2:Paddle = new Paddle(); 

     public function Engine() 
     { 
      paddle1.x = 30; 
      paddle1.color = 0xFF00FF; 
      stage.addChild(paddle1); 

      paddle2.x = stage.stageWidth - 45; 
      paddle2.color = 0xFF0000; 
      stage.addChild(paddle2); 
     } 

    } 

} 

classe Paddle:

package 
{ 
    import flash.display.MovieClip; 
    import flash.display.Shape; 
    import flash.display.Graphics; 
    import flash.events.Event; 

    public class Paddle extends MovieClip 
    { 
     public var color:uint = 0xFFFFFF; 

     public function Paddle() 
     { 
      var child:Shape = new Shape(); 
      child.graphics.beginFill(color); 
      child.graphics.drawRect(0, 260, 15, 80); 
      child.graphics.endFill(); 
      addChild(child); 
     } 

    } 

} 

Si la modification des propriétés de cette manière est pas la meilleure façon de faire les choses alors bien sûr le dire. Sinon, qu'est-ce que je fais de mal que ça ne marche pas? On dirait que c'est quelque chose à voir avec l'ordre (au moment où la classe principale change l'attribut de couleur, il est déjà créé le rectangle et il est trop tard pour le changer?)

Merci: D

EDIT: réalisé qu'il pourrait aider à dire ce qui se passe quand j'exécute ce code. Fondamentalement changer l'attribut de couleur de la classe du moteur ne change pas la couleur du rectangle et ils ont tous deux rester juste blanc (FFFFFF)

Répondre

1

Le problème que vous rencontrez est que lorsque vous faites:

new Paddle(); 

Votre code constructeur est exécuté. Cela signifie que le rectangle a déjà été dessiné avec la couleur définie en haut de la classe. Vous changez ensuite la propriété de couleur après cela, ce qui, comme vous pouvez le voir, n'a aucun effet. Je suggère que vous fassiez une draw() fonction pour votre Paddle. Il pourrait accepter une couleur et être utilisé pour dessiner le rectangle. Il pourrait ressembler à ceci:

public class Paddle extends MovieClip 
{ 

    private var _child:Shape; 


    public function Paddle() 
    { 
     _child = new Shape(); 
     addChild(_child); 
    } 


    public function draw(color:uint):void 
    { 
     _child.graphics.clear(); 
     _child.graphics.beginFill(color); 
     _child.graphics.drawRect(0, 260, 15, 80); 
     _child.graphics.endFill(); 
    } 

} 

De cette façon, offre un avantage qui est que vous pouvez modifier les arguments de draw() d'accepter les dimensions de votre rectangle ou d'autres éléments qui affecteront les visuels. Ce sera plus propre et plus rapide que d'avoir à ajouter plus de propriétés à la classe elle-même si vous décidez que vous voulez faire cela.

Vous êtes alors en mesure de le faire:

var paddle1:Paddle = new Paddle(); 
var paddle2:Paddle = new Paddle(); 

paddle1.draw(0xFF00FF); 
paddle2.draw(0xFF0000); 
+0

Ah, il était comme je m'y attendais, mais j'étais trop fatigué pour voir correctement, il. J'avais le sentiment que cela avait quelque chose à voir avec l'ordre dans lequel le code était en train d'être exécuté, cependant. Votre suggestion de la fonction de tirage fonctionne bien, merci! – Ellis

0

Pourquoi ne pas faire les deux? : D

public class Paddle extends MovieClip 
{ 
    private var color:uint; 
    private var rec:Shape; 

    public function Paddle(newColor:uint = 0xFFFFFF) // default color 
    { 
     color = newColor; 
     rec = new Shape(); 
     drawShape(); 
     addChild(rec); 
    } 

    public function drawShape() 
    { 
     child.graphics.clear(); 
     child.graphics.beginFill(color); 
     child.graphics.drawRect(0, 260, 15, 80); 
     child.graphics.endFill(); 
    } 

    public function setColor(newColor:uint) 
    { 
     color = newColor; 
     drawShape(); 
    } 
} 
1

Qu'est-ce que vous pourriez faire est de permettre au constructeur d'attribuer une couleur en plus à la création d'un compositeur pour la couleur, ayant deux appels de dessin ensuite la palette (qui, par ailleurs, pourrait aussi être un simple flash.display.Shape):

Pagaie.comme:

package 
{ 
    //Imports 
    import flash.display.Sprite; 

    //Class 
    public class Paddle extends Sprite 
    { 
     //Constants 
     private static const DEFAULT_COLOR:uint = 0xFF0000; 

     //Properties 
     private var mColor:uint; 

     //Constructor 
     public function Paddle(color:uint = DEFAULT_COLOR) 
     { 
      mColor = color; 

      draw(); 
     } 

     //Draw 
     private function draw():void 
     { 
      graphics.clear(); 
      graphics.beginFill(mColor); 
      graphics.drawRect(0, 0, 15, 80); 
      graphics.endFill(); 
     } 

     //Set Color 
     public function set color(value:uint):void 
     { 
      mColor = value; 

      draw(); 
     } 

     //Get Color 
     public function get color():uint 
     { 
      return mColor; 
     } 
    } 
} 

maintenant vous pouvez créer et la position autant d'instances de Paddle que vous voulez, chacun ayant leur propre poseur de couleur:

Instance Rouge:

var paddleRed:Paddle = new Paddle(); 
paddleRed.y = 10; 
addChild(paddleRed); 

vert Instance:

var paddleGreen:Paddle = new Paddle(0x00FF00); 
paddleGreen.y = 126; 
addChild(paddleGreen); 

Instance Bleu:

var paddleBlue:Paddle = new Paddle(); 
paddleBlue.color = 0x00FF00; 
paddleBlue.y = 260; 
addChild(paddleBlue); 
Questions connexes