【问题标题】:Updating element position using ENTER_FRAME event使用 ENTER_FRAME 事件更新元素位置
【发布时间】:2012-10-22 21:43:27
【问题描述】:

我在简单的打砖块游戏中更新桨位置时遇到问题,我正在使用以下侦听器做出反应:

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 事件是否有效?

【问题讨论】:

  • 第二个问题:ENTER_FRAME 很好,但您也可以使用间隔为 0 的计时器。mouseX 位于本地坐标中(在这种情况下,相对于 paddle 的左上角),其中可能是什么弄乱了运动。你可以调用localToGlobal来转换mouseX。

标签: actionscript-3


【解决方案1】:

正如 Cameron 所提到的,如果您将 movePaddle() 移动到 Paddle 类本身,mouseX 和 mouseY 将引用 Paddle MovieClip 中的鼠标位置。也就是说,如果 Paddle 在舞台上是 50,50,而鼠标在舞台上是 100, 100,那么您将收到的鼠标坐标将为 50,50。

更安全的选择是使用Stage 给出的mouseX 和mouseY 值:

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的构造函数中,如下所示:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    相关资源
    最近更新 更多