在游戏开发中,经常会用到计时器,在cocos引擎中,为我们默认提供了多种计时器的使用。在最新的cocos开发工具Cocos Creator中,我们有4种计时器可以使用,分别是js自带的setTimeOut、interval以及cocos的schedule和scheduleOnce,setTimeOut和scheduleOnce都是执行几次操作,指定一定时间后执行,interval和schedule都是可以指定执行次数的。这里主要对schedule进行相关的说明,因为这里面有一个坑。
当我们将一个组件挂在是一个控件上后,例如,我们在一个飞机大战的游戏中,想创建子弹,就可以用schedule每隔一段时间进行创建,或者,每隔一段时间,进行一些其他的操作等。但是,最近在使用schedule的时候,发现了一个大坑,或许,也是自己对这个东西不熟悉,但不管怎样,还是将这个东西分享出来,方便他人的使用,防止别人入坑,也算是记录一下自己在开发中的心得。大家都知道,schedule一般可以传3或者4个参数,3个参数的使用如下:
component.schedule(function() { this.doSomething(); }, interval, repeat);如果就是当前的脚本中,就可以直接用this.schedule了,第一个就是回调方法,一般来说,如果要用当前组件中的方法,需要写成function(){}.bind(this)的形式,否则会报错,这里的interval当然是时间间隔,以秒为单位,每隔interval就执行一次,repeat就是重复执行的次数,默认情况下,当repeat为0的时候,会执行一次,这个repeat表示重复执行次数,是在已经执行过一次之后的重复次数,这点值得注意。还有一种用法,是延时执行的,用法如下:
component.schedule(function() { this.doSomething(); }, interval, repeat, delay);这里只不过是多了一个delay,别的没有什么区别,总共会执行里面的方法repeat+1次,第一次在delay时间之后执行,然后每隔interval秒执行一次里面的方法。然而,问题来了, 如果将delay设置成0,是否会立刻执行呢?显然,并不是这样的!这就是这个计时器的坑。 如果将delay置为0,默认情况下,第一次执行仍然会延时,而且延时时间是interval。因此,在开发中,如果要开启多个计时器,而且,每隔计时器的延时时间都不一样,但是,却有一定规律,例如,在for循环中创建5个计时器,每个计时器的delay = i;这样就会出问题,第一个计时器的delay设置为0,但是实际上变成了interval,为了避免这种事情发生,可以将让delay = i + 0.1,只要给一个初始的很小的值就好了,或者,判断一下,当i = 0 的时候,就不调用带delay的方法,直接调用第一个方法就行了,这样,就避免了这种问题的发生。