- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 AS3/Flex 4 中编写一个简单的游戏,并且我正在尝试从一开始就找到处理代码定时执行的最佳方法。
最自然的方法是在整个程序中使用一堆 Timer
对象。然而,与 ENTER_FRAME
相比,这在 CPU 周期上应该是相当昂贵的。
但是我不确定将所有程序的定时执行都基于 ENTER_FRAME
是多么自然,而且我在 stackoverflow 上读到它有问题 - Timer
不会 - 关于当程序复杂性增加时降低动画和帧率。
想到的另一种选择是在程序中简单地使用一个 Timer
对象,它的事件处理程序将遍历并一次检查所有内容 - 有点像混合通常的 计时器
和ENTER_FRAME
方法。
我的问题是:对于 AS3/Flex 4 中的视频游戏来说,真正最好的创意是什么,为什么?谢谢!
最佳答案
这完全取决于何时您想要更新值、检查碰撞、管理输入等以及您何时想要在屏幕上实际看到发生的事情。
ENTER_FRAME
将使您的更新逻辑和游戏呈现同步。
每次分派(dispatch) ENTER_FRAME
事件时,都会重新绘制场景。这意味着您的所有游戏更新逻辑总是紧跟正在呈现的屏幕。如果由于屏幕上的复杂图形需要很长时间才能渲染而导致游戏中的帧速率下降,那么游戏更新的速率也会下降。 ENTER_FRAME
调度不稳定,这意味着它们不适合您需要以均匀间隔执行的更新任务。
计时器将使您的更新逻辑和游戏呈现变得异步。
与 ENTER_FRAME
处理程序相比,计时器的触发频率可能更高或更低。这意味着您的更新循环可以在重绘场景之前运行多次,或者场景可以重绘多次而没有任何变化。计时器比 ENTER_FRAME
处理程序更稳定,使它们更擅长按设定的时间间隔做某事。尽管如此,更新之间仍然会有一点偏移:
Depending on the SWF file's framerate or the runtime environment (available memory and other factors), the runtime may dispatch events at slightly offset intervals. For example, if a SWF file is set to play at 10 frames per second (fps), which is 100 millisecond intervals, but your timer is set to fire an event at 80 milliseconds, the event will be dispatched close to the 100 millisecond interval. Memory-intensive scripts may also offset the events.
- help.adobe.com | flash.utils.Timer
我个人一直使用 ENTER_FRAME
与定时器。对我来说,如果我对游戏中的对象进行更改,这些更改应该立即显示在屏幕上,这是合乎逻辑的。
如果您希望能够比帧速率能够管理的更快地更新游戏中的组件,那么定时器是个不错的选择。如果您希望在特定时间范围内完成给定数量的更新,计时器也很好,因为它们不像 ENTER_FRAME
那样受屏幕重绘速率的限制。
至于实际实现,您最好选择一个并实现一个处理程序。这意味着您在整个游戏中应该只有一个函数,该函数将由 Timer 或 ENTER_FRAME
触发。您不希望在每个应该更新的类中创建单独的处理程序。相反,您希望让您的顶级类(或该类的近亲)定义处理程序。您还想在该类中创建一个列表,该列表将代表游戏中需要更新的所有内容。
从那里,您将创建一小部分方法,这些方法将处理从该类中列出和取消列出可更新实例。每个可更新实例将实现一个接口(interface)或扩展一个定义 update()
方法的类。它可能看起来像这样:
public interface IUpdatable
{
function update();
}
从那里开始,更新程序类中的更新处理程序将简单地遍历列表中的所有可更新项并调用它们的 update()
方法,如下所示:
for each(var i:IUpdatable in updateList)
{
i.update();
}
最后要注意的是,这种方法意味着如果您决定从使用 ENTER_FRAME
处理程序切换到 Timer,反之亦然,这只是更新程序类中的一个简单切换,不需要您可以更改游戏代码的任何其他部分。如果您在每个需要更新的类中四处创建处理程序,那么您改变主意将意味着对每个类进行更改。
关于actionscript-3 - TimerEvent 与 AS3/Flex 游戏中的 ENTER_FRAME?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16291570/
假设我们在 Flash 库中有一个动画片段“Enemy”,并且有一个类“Enemy.as”与之相关联,它监听 ENTER_FRAME 事件,如下所示, public function Enemy():
我正在构建一个游戏,它总是有一些移动的东西,所以我使用了很多 Timer 实例来控制重复和触发 Action 。 现在问题是我开始注意到一些性能“滞后”。这是因为计时器吗?您是否建议改用 ENTER_
我有一个依赖于 ENTER_FRAME 的脚本每次运行的事件。我注意到在一些较慢的计算机上播放 Flash 电影时可能会出现一些延迟。 是否ENTER_FRAME在每一帧上运行,即使它在慢速计算机上?
因此 ENTER_FRAME 属性将在游戏运行的每一帧上向舞台添加一个对象。如果游戏是 24 fps,每秒创建 24 个对象。我该如何限制它,使其每 4 帧生成一个对象? 最佳答案 你可以有一个每帧递
这是我在 Flash/AS3 中的代码,在主类中。 addEventListener(Event.ENTER_FRAME,function(e:Event){ if(findObjec
我正在尝试将“Actionscript 3.0:游戏编程大学”中的效果转换为 HTML5 Canvas 渲染,更具体地说,是 Create/EaselJS。 这是我正在编写的代码: priva
我正在尝试在 AS3/Flex 4 中编写一个简单的游戏,并且我正在尝试从一开始就找到处理代码定时执行的最佳方法。 最自然的方法是在整个程序中使用一堆 Timer 对象。然而,与 ENTER_FRAM
我已经处理这个问题好几天了。我已经黔驴技穷了! 我似乎无法在任何论坛、文档等的任何地方找到明确的答案。 第一次运行时一切看起来都很好,或者当我加载下一个级别供用户玩时。但是如果用户按下 ESC 键来加
我在将 ENTER_FRAME 和 TIMER 方法用于更新方法时寻找它们之间的一些比较。我在互联网上四处寻找一些答案,但我仍然觉得很难理解。 谁能帮助简化它们之间的差异? 最佳答案 计时器事件可以独
我是一名优秀的程序员,十分优秀!