(七)scheduler 定时器

定时器用的地方还是比较多的,游戏中的逻辑判断很多都是采用每帧执行。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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值