定时器用的地方还是比较多的,游戏中的逻辑判断很多都是采用每帧执行。Quick对于schedule的封装在scheduler这个Lua文件中。如果是第一次接触Quick的话,可能按照官方的API来写一个定时器被报错,提示schedule是一个nil值,这是因为其他的模块在初始化时都是被加载的,唯独这个scheduler没有载入,所以在使用的时候,第一件事是引入这个模块,
1
|
local scheduler = require(
"framework.scheduler"
)
|
剩下的就可以看着API来写了,在写quick的定时器之前还是再复习一下cocos2dx原生lua对于定时器的写法。
每帧调用的
1
2
|
void
scheduleUpdateWithPriority (
int
priority)
void
scheduleUpdateWithPriorityLua (
int
nHandler,
int
priority)
|
指定调用间隔时间的
1
|
unsigned
int
scheduleScriptFunc (unsigned
int
nHandler,
float
fInterval,
bool
bPaused)
|
还有取消定时器事件
1
|
void
unscheduleScriptEntry (unsigned
int
uScheduleScriptEntryID)
|
Quick的scheduler主要是对后面两个函数的封装。在c++的cocos使用中,我们使用定时器,无非就是每帧调用,间隔时间调用无数次,间隔时间调用指定次数,间隔时间调用一次,取消调用这几个。
每帧调用
1
2
3
4
5
6
|
local
time
= 0
local function update(dt)
time
=
time
+ 1
label:setString(string.format(
"%d"
,
time
))
end
scheduler.scheduleUpdateGlobal(update)
|
间隔一定时间调用
1
2
3
4
5
6
|
local
time
= 0
local function onInterval(dt)
time
=
time
+ 1
label:setString(string.format(
"%d"
,
time
))
end
scheduler.scheduleGlobal(onInterval, 1)
|
间隔时间调用一次,这个封装的不错,很常用
1
2
3
4
5
6
7
8
|
local
time
= 0
local function onInterval(dt)
time
=
time
+ 1
label:setString(string.format(
"%d"
,
time
))
print(
"over"
)
end
scheduler.performWithDelayGlobal(onInterval, 1)
|
可以看下这个是怎么实现的
1
2
3
4
5
6
7
8
|
function scheduler.performWithDelayGlobal(listener,
time
)
local handle
handle = sharedScheduler:scheduleScriptFunc(function()
scheduler.unscheduleGlobal(handle)
listener()
end,
time
,
false
)
return
handle
end
|
其实就是在间隔一定时间后,将其停止,然后执行一次回调函数就可以了。
封装的最后一个是停止这些定时器
1
|
scheduler.unscheduleGlobal()
|
它的参数是前面那些定时器返回的句柄,所以如果需要在后面停止掉,记得在创建的留一个返回值就好了。
不过在游戏中,我们可能会做一个倒计时,也就是间隔一定时间调用指定的次数,这个是在quick中没有封装的,但是我们还是可以自己动手实现一下,原理也很简单,每次执行一次就计个数,达到指定的次数就停止定时器,
1
2
3
4
5
6
7
8
9
10
11
12
13
|
local handle
local interval = 1
local repeatIndex = 3
local index = 0
local sharedScheduler = CCDirector:sharedDirector():getScheduler()
handle = sharedScheduler:scheduleScriptFunc(function()
index = index + 1
label:setString(string.format(
"%d"
, index))
if
index >= repeatIndex then
scheduler.unscheduleGlobal(handle)
print(
"over"
)
end
end, interval,
false
)
|
效果图点击:scheduler 定时器.gif
这样就ok了,大家可以自己试一试哈。
定时器就是这样子了。
来源网址:http://blog.csdn.net/w337198302/article/details/38677971