Actionscript 3 使用“输入帧”事件更新元素位置

Actionscript 3 使用“输入帧”事件更新元素位置,actionscript-3,Actionscript 3,在简单的arkanoid游戏中,我在更新桨位置时遇到了一个问题,我正在使用以下侦听器做出反应: paddle.addEventListener(Event.ENTER_FRAME, movePaddle) 当在Main中定义了moveblade()函数时,一切正常,但当我重构代码并将moveblade()函数放入blade类并将侦听器更改为: paddle.addEventListener(Event.ENTER_FRAME, paddle.movePaddle) 结果是桨叶在所需值和其他值

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

paddle.addEventListener(Event.ENTER_FRAME, movePaddle)
当在
Main
中定义了
moveblade()
函数时,一切正常,但当我重构代码并将
moveblade()
函数放入
blade
类并将侦听器更改为:

paddle.addEventListener(Event.ENTER_FRAME, paddle.movePaddle)
结果是桨叶在所需值和其他值之间每帧改变一个位置

下面的
moveblade()
函数:

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;
    }
}
公共功能移动挡板(事件:事件):无效
{
//调试
trace(this.x);
trace(this.y);
this.x=mouseX-this.width/2;
如果(鼠标X=stage.stageWidth-this.width)
{
//向左偏多
this.x=stage.stageWidth-this.width;
}
}
第二个问题:
使用
ENTER\u FRAME
事件是否有利于游戏的优化?

正如Cameron所提到的,如果将
movepable()
移动到
paile
类本身,
mouseX
mouseY
将指的是鼠标在paile MovieClip中的位置。也就是说,如果划桨在舞台上的位置是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;
        }
    }
}
我将把它放在
的构造函数中,如下所示:

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

至于
ENTER\u FRAME
的性能,这很好,但是在一个结构合理的游戏中,我会有一个
ENTER\u FRAME
处理程序,它在一系列游戏实体上循环,并通过调用每个实体上的方法来更新它们。

第二个问题:ENTER\u FRAME很好,但也可以使用间隔为0的计时器。mouseX位于局部坐标中(在本例中是相对于
拨片的左上角),这可能是造成移动混乱的原因。您可以调用localToGlobal来转换mouseX。
public function Paddle()
{
    addEventListener(Event.ENTER_FRAME, movePaddle);
}