游戏开发实战宝典
上QQ阅读APP看书,第一时间看更新

3.3 时间控制

Egret引擎提供了三种时间控制的方法:计时器、心跳以及帧事件。通过时间控制,开发者可以让软件周期性地执行代码。

3.3.1 计时器

计时器用来在某一时间段之后执行代码,可以执行一次,也可以执行多次。

首先创建一个称为Timer的项目,删除src文件内的所有文件,然后创建一个名为Main.ts的类文件,并做出如下修改,参见二维码3-12:

二维码3-12

运行调试播放器观看结果,在调试窗口会有如下输出,如图3-18所示:

图3-18 计时器窗口输出结果

调试窗口会每隔半秒输出“计时”,在最后一次会输出“计时结束”。

在代码的第4行,创建了一个egret.Timer对象,这个就是计时器类。该类的构造函数的原型如下:

以下是对各个参数的解释:

delay:计时器事件间的延迟(以ms为单位)。建议 delay 不要低于20ms。计时器频率不得超过60帧/s,这意味着低于16.6ms(1000ms/60)的延迟可导致出现运行时问题。

repeatCount:指定重复次数。如果为零,则计时器将持续不断重复运行。如果不为0,则将运行计时器,运行次数为指定的次数,然后停止。

代码第5行,timer对象注册了egret.TimerEvent.TIMER事件的监听器——onTimer方法,该方法会在每次延迟结束后执行。

代码第7行,timer对象注册了egret.TimerEvent.TIMER_COMPLETE事件的监听器——onTimerComplete方法,该方法会在所有延迟完毕之后执行。

代码第9行,执行了timer对象的start方法,该方法让计时器开始计时。

egret.Timer类还有另外两个方法:reset和stop,前者让计时器重新开始,后者用来停止计时器。

3.3.2 心跳

Egret引擎会在相对固定的时间间隔产生心跳事件,开发者可以把回调函数传递给心跳事件处理。心跳的时间间隔跟当前的帧速率没有直接关系。

本案例将展示心跳的使用方式,注意心跳的时间间隔和回调方式。

首先创建一个称为Ticker的项目,删除src文件夹内的所有文件,然后创建一个名为Main.ts的类文件,并对其做出如下修改,参见二维码3-13:

二维码3-13

运行调试播放器,在调试窗口有如下输出,如图3-19所示:

可以看出来,心跳的时间平均间隔是17ms左右。

代码第6 行,开始心跳,并传递给引擎一个回调函数——onTicker。该回调函数的原型如下:

图3-19 心跳窗口输出结果

参数timestamp是当前的时间戳,每次心跳引擎会把这个参数传递给回调函数。如果函数返回true,将在回调函数执行完成之后立即重绘。如果返回false则不会重绘。

3.3.3 帧事件

Egret引擎会在每帧的开始产生帧事件,所以该事件发生的频率是跟帧率有关的。

首先创建一个称为FrameEvent的项目,删除src文件夹内的所有文件,然后创建一个名为Main.ts的类文件,并做出如下修改,参见二维码3-14:

二维码3-14

运行调试播放器,在调试窗口有如下输出,如图3-20所示:

图3-20 帧事件窗口输出结果

课后作业:通过将index.html里的data-frame-rate属性改为“60”,从而将帧率改为60,然后运行调试播放器观看结果。