1

好的,所以我最近一直在尝试正确理解 AS3 中的 OOP。现在我有一个非常简单的场景,我有一个类 Paddle,它绘制一个矩形。在我的文档类中,我创建了 Paddle 类的两个实例,即 paddle1 和 paddle2。

我还为我的 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

编辑:意识到当我执行这段代码时会发生什么可能会有所帮助。基本上从 Engine 类更改颜色属性不会改变矩形的颜色,它们都只是保持白色(FFFFFF)

4

3 回答 3

1

您遇到的问题是,当您这样做时:

new Paddle();

您的构造函数代码已运行。这意味着已经使用类顶部定义的颜色绘制了 Rectangle。然后,您将在此之后更改颜色属性,如您所见,这没有任何效果。

我建议你draw()为你的Paddle. 它可以接受一种颜色并用于绘制矩形。它可能看起来像这样:

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()以接受 Rectangle 或其他会影响视觉效果的元素的尺寸。如果您决定要这样做,这将比必须向类本身添加更多属性更清洁和更快。

然后你可以这样做:

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

paddle1.draw(0xFF00FF);
paddle2.draw(0xFF0000);
于 2013-02-05T22:32:26.037 回答
1

除了为颜色创建一个设置器之外,您可能要做的是允许构造函数分配一种颜色,随后两个调用都绘制桨(顺便说一下,它也可以是一个简单的 flash.display.Shape):

桨.as:

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

所以现在您可以创建和定位任意数量的 Paddle 实例,每个实例都有自己的颜色设置器:

红色实例:

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);
于 2013-02-05T22:48:43.810 回答
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();
    }
}
于 2013-02-05T22:43:46.403 回答