1

さて、私は最近、AS3のOOPに頭を悩ませようとしています。今のところ、長方形を描くクラスPaddleがあるという非常に単純なシナリオがあります。私のドキュメントクラスでは、Paddleクラスの2つのインスタンス、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);
        }

    }

}

この方法でプロパティを変更することが最善の方法ではない場合は、もちろんそう言ってください。そうでなければ、それが機能しないという私は何を間違っていますか?順序に関係しているようです(メインクラスが色属性を変更するまでに、既に長方形が作成されており、変更するには遅すぎますか?)

ありがとう

編集:このコードを実行するとどうなるかを言うのに役立つかもしれないことに気づきました。基本的に、Engineクラスからcolor属性を変更しても、長方形の色は変更されず、両方とも白のままです(FFFFFF)

4

3 に答える 3

1

あなたが抱えている問題は、あなたがそうするときです:

new Paddle();

コンストラクターコードが実行されます。これが意味するのは、長方形がクラスのトップで定義された色ですでに描画されているということです。この後、colorプロパティを変更しますが、ご覧のとおり効果はありません。

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()この方法には、の引数を変更して、長方形またはビジュアルに影響を与えるその他の要素の寸法を受け入れることができるという利点があります。これを行う場合は、クラス自体にプロパティを追加するよりもクリーンで高速になります。

その後、これを行うことができます:

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でもあります):

Paddle.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 に答える