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