Dt和帧率独立游戏

Dt和帧率独立游戏

帧率独立游戏是指以相同速度运行的游戏,不受FPS(每秒帧数)影响.例如游戏可能在性能比较慢的设备以30FPS运行,在性能比较好的设备以60FPS运行,帧率独立游戏在两种性能的电脑上会以相同的速度运行.换一个说法,依赖帧率游戏在性能比较慢的设备上就像以慢动作一样.制作帧率独立游戏可以确保玩游戏的设备不管性能的快慢,都有一样的效果,不会因为FPS降低而影响游戏的可玩性.

这篇教程将会介绍如何制作帧率独立游戏.

Dt系统概念

制作帧率独立游戏最重要的一个部分就是Dt系统.Dt表示增量时间即获取上一帧到这一帧的时间.例如在100FPS游戏时Dt将会是0.01秒,在10FPS游戏时Dt将会是0.1,在游戏运行期间Dt是每一帧逐次变化,所以在长时间游戏中,Dt将不会是一个相同的值.

请尝试制作以下事件,设置一个全局变量时间,设置事件条件每帧执行,动作加法运算值设置Dt,然后把文本值设置为全局变量时间.

预览一下,我们可以看到全局变量一直增加Dt,文本显示全局变量值,这里我们可以发现每一秒刚好加1.因为一秒钟内所有的Dt相加必须为1.

怎么使用Dt

一般我们制作依赖帧率游戏让对象运动事件如下.

每帧执行,猴子对象设置X坐标位置+1,即猴子每帧向右移动一个像素.将游戏在30FPS和60FPS的设备上分别运行会看到不同的效果,在30FPS的设备上猴子每秒向右移动30像素,在60FPS的设备上猴子每秒向右移动60像素.

我们在上面的例子测试了,Dt每秒总是加1,因此我们把事件改成下图所示.

更改了事件之后,猴子对象在任何FPS的设备上都将会以60像素/每秒向右移动,由于Dt每秒总数为1,因此60*Dt即每秒增加60.无论在30FPS或者60FPS的设备上,都是以60像素/每秒向右移动.

在哪里使用Dt

如果想要制作帧率独立游戏时,想要以稳定的速度移动对象时,都需要使用Dt来实现.例如我们希望对象向前移动,我们可以设置60*Dt向前移动,事件如下图所示.

能力已经默认使用Dt系统

所有唤境Evkworld的能力关于运动计算中都已经默认Dt系统.即八方向运动,平台跳跃等速度属性不需要另外的处理.

不过这里有一个特殊的地方,物理是一个例外,默认情况下,物理不会使用Dt系统,物理还是取决于FPS.这是因为Dt系统会有比较小的随机变化,这种随机变化会让物理游戏中相同的设置会产生不同的效果,即使同样的事件发生两次也有可能发生不同的效果.

时间尺度

在唤境Evkworld有一个非常棒功能是时间尺度.时间尺度可以允许更改游戏中的速率时间.在系统动作”设置时间尺度”来设置游戏中的速率时间.时间尺度为1表示为正常速度,时间尺度为0.5表示比正常速度慢一半,时间尺度为2表示比正常速度快两倍.例如如果在游戏过程中设置时间尺度更改为0.1,即将游戏以1/10的速度运行,这样其实就制作了一个慢动作的效果.

时间尺度的原理是更改Dt的返回值.改变时间尺度将会影响使用能力的对象或者使用Dt的事件.如像本教程第一个事件没有使用Dt系统控制运动,更改时间尺度将不受任何影响.

暂停/恢复游戏中速率时间

我们可以设置时间尺度为0,这样设置之后将会将游戏中的速率时间为0即暂停效果.重新设置时间尺度为1即把游戏恢复正常.在设置时间尺度为0后,可能有一些点击事件依然会被触发,所以可以把这些触发事件放进事件组中,在时间尺度为0时,禁用事件组,设置时间尺度为1后,启用事件组.这样来制作暂停/恢复游戏功能.

对象的时间尺度

在系统动作中”设置对象的时间尺度”可以对实例对象单独设置时间尺度,通过单独设置对象的时间尺度可以让游戏其他对象慢动作运动,但主角依然可以全速运行.对象有自己的Dt表达式(猴子.dt),在一个游戏中希望不同对象有不同的时间尺度时,设置事件时则分别使用对应的Dt表达式(系统.dt或者对象.dt).

其他种类使用Dt

制作帧率独立游戏时,有关于速度的地方都需要使用Dt系统,如角度,加速度等等.

角度

加速度

如下图所示,为对象建立一个实例变量速度,然后通过事件设置对象向右运动为速度dt每秒,然后设置子事件,当速度<300时,设置速度增加100Dt,即对象加速度为100像素/每秒.

常见错误

不要在系统条件”每隔X秒”中使用Dt系统.无论设备的FPS如何,”每隔X秒”条件都不受FPS影响.这个条件判断的是时间而不是帧.例如如果你设置一个”每隔60*dt”秒条件,那么这个条件将会根据FPS产生变化,在100FPS(Dt=0.01)设备中,这个条件将会是每隔0.6(60 * 0.01)秒触发一次,若在10FPS(Dt=0.1)设备中,这个条件将会是每隔6秒(60 * 0.1)秒触发一次.所以当使用”每隔X秒”条件时,不需要使用DT系统.