2011-01-05 76 views
0

我有一个关于在Flash中制作Flash游戏的问题。 现在我正在开发2D格斗游戏,下面是链接:http://xoz.netai.net/stickfightjx/StickFightJX.html最佳方式来优化我的自制Flex游戏?

但是,我不确定我为主循环编程的效率如何。

由于我从未读过教程或看过其他任何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(); 
} 

回答

1

你有什么应该可以正常工作,但是如果帧率低于预期的慢速计算机可能会遇到麻烦。

对于流畅的动画,您需要监听ENTER_FRAME事件。您的update()方法应该将自上一帧以来的时间增量作为参数。您可以使用它来将计算结果关闭,而不是关闭帧。

例如:

... 
// Called from your original code. 
private function update():void 
{ 
    xPos += 10; 
    yPos += 5; 
} 
... 

在这种情况下,更新对象将具有其XPOS和yPos成员经常作为定时器事件被调用增加分别由10和5。在慢速电脑上,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; 
} 
... 

在这种情况下,更新对象将通过10和5不论CPU有多慢是改变其XPOS和yPos成员分别每秒一次(如果你的DeltaT以秒为单位)。自从您使用ENTER_FRAME事件以来,每次绘制画面时,更新也会一次且仅发生一次。