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

第二个问题:ENTER_FRAME就游戏优化而言,使用事件是否有效?

4

1 回答 1

1

正如 Cameron 所提到的,如果您移动movePaddle()Paddle类本身,mouseX并且mouseY将参考 Paddle MovieClip 内的鼠标位置。也就是说,如果 Paddle 在舞台上是 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课堂上使用这一行:

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

我会把它放在Paddle's 的构造函数中,如下所示:

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

至于 的性能ENTER_FRAME,这很好,但是在结构合理的游戏中,我将有一个ENTER_FRAME处理程序,该处理程序循环遍历游戏实体的数组,并且它们通过在每个游戏实体上调用一个方法来更新它们。

于 2012-10-22T23:19:22.050 回答