2013-02-05 44 views
1

好的,所以我最近一直試圖在AS3的OOP中正確使用我的頭。現在我有一個非常簡單的場景,我有一個繪製矩形的類Paddle。在我的文檔類中,我創建了Paddle類的兩個實例paddle1和paddle2。更改AS3中的類屬性

我也爲我的Paddle類創建了一個屬性,我想要改變它繪製的矩形的顏色。我希望能夠從主類中調整此屬性。我知道我可以通過在實例化類時傳遞屬性來做到這一點,但似乎屬性會是一種更好的方式,現在我想知道這是否是正確的思維方式。

主類:

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); 
     } 

    } 

} 

槳類:

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); 
     } 

    } 

} 

如果以這種方式改變的屬性是不是做的事情那當然最好的方式說出來。否則,我做錯了什麼,它不工作?好像這件事情的順序做(由主類改變了顏色屬性的時候,它已經創建的矩形和爲時已晚去改變它?)

感謝:d

編輯:意識到這可能有助於說明執行此代碼時會發生什麼。基本上改變來自發動機類的顏色屬性不會改變矩形的顏色,他們都只是停留白色(FFFFFF)

回答

1

您遇到的問題是,當你這樣做:

new Paddle(); 

您的構造函數代碼已運行。這意味着Rectangle已經使用在類頂部定義的顏色繪製。在此之後,您將更改顏色屬性,正如您所看到的那樣沒有任何效果。

我建議你爲你的Paddle做一個draw()函數。它可以接受一種顏色並用於繪製矩形。這可能是這樣的:

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(); 
    } 

} 

這種方式提供了一個優點是可以修改的draw()參數接受您的矩形或會影響視覺效果等元素的尺寸。如果你決定要這樣做的話,這將比不得不爲類增加更多的屬性。

然後,您就能夠做到這一點:

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

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

啊,它是如我所料,但我太累了,適當地看到它。不過,我有一種感覺,它與代碼的執行順序有關。 您對繪圖功能的建議效果很好,謝謝! – Ellis

0

爲什麼不一舉兩得? :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

什麼你可能做的是讓構造函數除了指定顏色創建該顏色的制定者,同時具有通話隨後拉槳(其中,順便說一下,也可以簡單的flash.display.Shape):

槳。如:

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; 
     } 
    } 
} 

所以現在你可以創建和地位,許多槳情況下,只要你想,各自有自己的顏色設置器:

紅實例:

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

綠實例:

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

藍實例:

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