我正在尝试在AS3 / Flex 4中编写一个简单的游戏,我正试图从一开始就找到最好的方法来处理代码的定时执行。
最自然的方法是在整个程序中使用一堆Timer
个对象。然而,与ENTER_FRAME
相比,这在CPU周期上相当昂贵。
但是我不确定将所有程序的定时执行基于ENTER_FRAME
的基础是多么自然,而且我已经读过stackoverflow它有问题 - Timer
没有 - 关于在程序复杂性增加时拖动动画和帧速率。
想到的另一个选择是在程序中简单地使用一个Timer
对象,其事件处理程序将通过并一次性检查所有内容 - 有点像混合通常的Timer
和ENTER_FRAME
接近。
我的问题是:AS3 / Flex 4中的视频游戏最好的想法是什么?为什么?谢谢!
答案 0 :(得分:4)
当你想要在屏幕上实际看到发生的事情时,你想要更新值,检查冲突,管理输入等,这完全取决于。< / p>
每次调度 计时器会使您的更新逻辑和游戏呈现成为异步。 定时器可以比 根据SWF文件的帧速率或运行时环境(可用内存和其他因素),运行时可能会以稍微偏移的间隔调度事件。例如,如果SWF文件设置为以每秒10帧(fps)播放(100毫秒间隔),但您的计时器设置为以80毫秒触发事件,则事件将在接近100毫秒间隔发送。内存密集型脚本也可能会抵消事件。 我个人总是使用 如果您希望能够以比帧速率能够管理的速度更快的速度更新游戏中的组件,那么定时器就很好。如果您希望在特定时间范围内完成一定数量的更新,定时器也会很好,因为它们不受像 至于实际实现,您最好希望选择一个并实现一个处理程序。这意味着您应该只在整个游戏中拥有一个由定时器或 从那里,您将创建一个小方法集合,用于处理列表和从该类中列出可更新实例的列表。每个可更新实例将实现接口或扩展定义 从那里,updater类中的更新处理程序将简单地迭代列表中的所有可更新项并调用它们的 最后要注意的是,这种方法意味着如果您决定从使用
ENTER_FRAME
将使您的更新逻辑和游戏呈现同步。ENTER_FRAME
事件时,都会重绘场景。这意味着所有游戏更新逻辑始终紧跟所呈现的屏幕。如果游戏中的帧速率由于屏幕上的复杂图形而需要很长时间才能渲染,那么游戏更新的速率也会下降。 ENTER_FRAME
调度不稳定,这意味着它们不适合您需要在它们之间间隔执行的更新任务。 ENTER_FRAME
处理程序更频繁或更不频繁地触发。这意味着您的更新循环可以在重绘场景之前多次运行,或者可以多次重绘场景而不进行任何更改。定时器不如ENTER_FRAME
处理程序那么不稳定,使得他们在设定的时间间隔内做得更好。尽管如此,更新之间仍然会有一点抵消:
- help.adobe.com | flash.utils.Timer ENTER_FRAME
vs Timers。对我而言,如果我对游戏中的对象进行更改,那么这些更改应立即在屏幕上显示,这是合乎逻辑的。ENTER_FRAME
那样重绘屏幕的速率的限制。
ENTER_FRAME
触发的功能。您不希望在每个应更新的类中创建单独的处理程序。相反,您希望让您的顶级类(或该类的近亲)定义处理程序。您还希望在该类中创建一个列表,该列表将代表游戏中需要更新的所有内容。update()
方法的类。它看起来像这样:public interface IUpdatable
{
function update();
}
update()
方法,如下所示:for each(var i:IUpdatable in updateList)
{
i.update();
}
ENTER_FRAME
处理程序切换到Timer,反之亦然,那么它是updater类中的一个简单开关,不需要您更改游戏代码的任何其他部分。如果您在每个需要更新的课程中创建处理程序,那么您的改变意味着要对每个班级进行更改。