我有一个Flash游戏,我在2008年取回了它。这些天它运行得非常快。实际上太快了。我在FlashDevelop中设置为60fps,但我认为这只是限制绘制调用的数量。我认为我的逻辑在这些日子里每秒执行60次。我有一段时间没有做过ActionScript,但我注意到我正在使用一个执行逻辑循环的enterFrameHandler。它似乎没有设置约束。它就像我所说的那样被激怒了。有什么方法可以限制在30或60fps吗?我非常感谢任何帮助或想法。如果逻辑运行得太快,我的游戏就会被破坏:(
更新 随着一些ActionScript知识回归我,我只想到了一些东西。 enterFrameHandler是否受项目属性下Flash或FlashDevelop中fps设置的限制?任何人都可以证实吗?这意味着我的绘制调用和逻辑调用是1:1对吗?
答案 0 :(得分:2)
实际上,只有在渲染帧时才调用enterFrame处理程序(在你的情况下为60Hz)。
如果您可以通过测量时间来限制执行某些操作的次数。像这样:
// A property to store the last time the code was executed
protected var lastTimeCalled:int;
// Inside your enterFrame handler
protected function onEnterFrameHandler(e:Event): void {
var ti:int = getTimer(); // Get current time
var desiredFPS:Number = 60; // Actual framerate you want
var frameInterval:Number = 1000 / desiredFPS; // Desired ms per frame
if (isNaN(lastTimeCalled) || ti >= lastTimeCalled + frameInterval) {
// Execute code here
...
// Increase time (by chunks of fixed size for framerate self-adjustment)
lastTimeCalled = isNaN(lastTimeCalled) ? ti : lastTimeCalled + frameInterval;
}
}
请注意,如果您的SWF的帧速率设置为60,那么尝试将desiredFPS设置为60将不起作用;它可能只是导致一些帧被丢弃。这可能是测试你的enterFrame处理程序是否在其他地方被调用的好方法。