使用ENTER_FRAME事件更新元素位置

时间:2012-10-22 21:43:28

标签: actionscript-3

我在简单的arkanoid游戏中遇到了更新球拍位置的问题,我正在使用以下听众做出反应:

paddle.addEventListener(Event.ENTER_FRAME, movePaddle)

movePaddle()中定义Main函数时,一切正常,但是当我重构代码并将movePaddle()函数放入Paddle类并将侦听器更改为:< / p>

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事件好?

1 个答案:

答案 0 :(得分:1)

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

更安全的选择是使用mouseX给出的mouseYStage值:

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处理程序循环一个游戏实体数组,并通过调用方法更新它们在每个。