我有一个关于在Flex中制作Flash游戏的问题。 现在我正在开发2D格斗游戏,这里是链接:http://xoz.netai.net/stickfightjx/StickFightJX.html
但是,我不确定我对主循环进行编程的效率如何。
由于我从未阅读过教程或看过任何其他Adobe Flex游戏,因此我不知道如何实现它们。我有一个Timer实例,每24帧调用一次更新函数,它会更新所有游戏对象和视图。
有没有办法让它更快?我在浪费任何东西吗?
// This is in an MXML Application
private var timer:Timer = new Timer(1 / 24);
private function onInitialize(e:Event):void
{
timer.addEventListener(TimerEvent.TIMER, onUpdate);
timer.start();
}
private function onUpdate(e:TimerEvent):void
{
gameStateManager.update();
}
答案 0 :(得分:1)
你所拥有的应该可以正常工作,但是在帧率低于你预期的慢速计算机上你可能会遇到麻烦。
对于流畅的动画,您需要收听ENTER_FRAME事件。您的update()方法应该将自上一帧以来的时间增量作为参数。您可以使用它来根据时间而不是帧外计算。
例如:
...
// Called from your original code.
private function update():void
{
xPos += 10;
yPos += 5;
}
...
在这种情况下,更新对象将使其xPos和yPos成员分别增加10和5,与调用TIMER事件一样频繁。在慢速计算机上,CPU将无法跟上,更新之间的时间会更长,并且会减慢整个游戏的速度,使战斗变得更加轻松。
更新也将与帧速率不同步,导致动画看起来不稳定。发生这种情况是因为有时在再次渲染画布之前会有多个更新,这意味着该对象将改为将该xPos和yPos更改为该帧的20和10。
...
// Called from ENTER_FRAME with the time since the last call passed in.
private function update(deltaT:Number):void
{
xPos += 10 * deltaT;
yPos += 5 * deltaT;
}
...
在这种情况下,更新对象将分别将其xPos和yPos成员每秒更改一次10和5(如果deltaT以秒为单位),无论CPU速度有多慢。由于您正在使用ENTER_FRAME事件,因此每次渲染画布时,更新也会发生一次且仅发生一次。