2

パドルの位置を更新する単純なアルカノイドゲームに問題があります。次のリスナーを使用して反応します。

paddle.addEventListener(Event.ENTER_FRAME, movePaddle)

movePaddle()関数が定義されている場合、Mainすべてが正常に機能していますが、コードをリファクタリングmovePaddle()して関数をPaddleクラスに入れ、リスナーを次のように変更した場合:

paddle.addEventListener(Event.ENTER_FRAME, paddle.movePaddle)

その結果、パドルはフレームごとに目的の値と他の値の間で位置を変更します

以下のmovePaddle()機能:

public function movePaddle(event:Event):void
{
    // DEBUG
    trace(this.x);
    trace(this.y);

    this.x = mouseX - this.width / 2;

    if(mouseX < this.width / 2)
    {
        this.x = 0;
    }

    // To much to right
    if(this.x >= stage.stageWidth - this.width)
    {
        // To much to left
        this.x = stage.stageWidth - this.width;
    }
}

2番目の質問:ENTER_FRAMEゲームの最適化の観点から、イベントの使用は適切ですか?

4

1 に答える 1

1

キャメロンが述べたようmovePaddle()に、Paddleクラス自体に移動するmouseXmouseY、パドルムービークリップ内のマウスの位置を参照します。つまり、パドルがステージ上で50,50にあり、マウスがステージ上で100,100にある場合、受け取るマウス座標は50,50になります。

より安全なオプションは、 :で指定された値mouseXmouseY値を使用することです。Stage

public function movePaddle(event:Event):void
{
    if(stage != null)
    {
        x = stage.mouseX - width / 2;

        if(stage.mouseX < width / 2)
        {
            this.x = 0;
        }

        // To much to right
        if(x >= stage.stageWidth - width)
        {
            // To much to left
            x = stage.stageWidth - width;
        }
    }
}

Main私がするもう1つのことは、クラスにこの行を含めるのではなく、次のことです。

paddle.addEventListener(Event.ENTER_FRAME, paddle.movePaddle);

代わりに、Paddle次のようにのコンストラクターに入れます。

public function Paddle()
{
    addEventListener(Event.ENTER_FRAME, movePaddle);
}

のパフォーマンスに関してはENTER_FRAME、これは問題ありませんが、適切に構造化されたゲームでは、ゲームエンティティの配列をループする単一のENTER_FRAMEハンドラーがあり、それぞれのメソッドを呼び出すことですべてを更新します。

于 2012-10-22T23:19:22.050 に答える