微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

quick-cocos2d-x游戏开发【7】——scheduler 定时器

定时器用的地方还是比较多的,游戏中的逻辑判断很多都是采用每帧执行。quick对于schedule的封装在scheduler这个lua文件中。如果是第一次接触quick的话,可能按照官方的api来写一个定时器被报错,提示schedule是一个nil值,这是因为其他的模块在初始化时都是被加载的,唯独这个scheduler没有载入,所以在使用的时候,第一件事是引入这个模块,

[html] view plain copy
  1. localscheduler=require("framework.scheduler")

剩下的就可以看着api来写了,在写quick的定时器之前还是再复习一下cocos2dx原生lua对于定时器的写法。

每帧调用的,

void scheduleUpdateWithPriority(int priority)

void scheduleUpdateWithPriorityLua (int nHandler,int priority)


指定调用间隔时间的

unsigned int scheduleScriptFunc(unsigned int nHandler,float fInterval,bool bPaused)


还有取消定时器事件

void unscheduleScriptEntry (unsigned int uScheduleScriptEntryID)


quick的scheduler主要是对后面两个函数的封装。在c++的cocos使用中,我们使用定时器,无非就是每帧调用,间隔时间调用无数次,间隔时间调用指定次数,间隔时间调用一次,取消调用这几个。

我们依次来看下,

每帧调用

    localtime=0
  1. localfunctionupdate(dt)
  2. time=time+1
  3. label:setString(string.format("%d",time))
  4. end
  5. scheduler.scheduleUpdateGlobal(update)

间隔一定时间调用

    localfunctiononInterval(dt)
  1. scheduler.scheduleGlobal(onInterval,1)


间隔时间调用一次,这个封装的不错,很常用

    print("over")
  1. end
  2. scheduler.performWithDelayGlobal(onInterval,1)

可以看下这个是怎么实现的,

    functionscheduler.performWithDelayGlobal(listener,time)
  1. localhandle
  2. handle=sharedScheduler:scheduleScriptFunc(function()
  3. scheduler.unscheduleGlobal(handle)
  4. listener()
  5. end,time,false)
  6. returnhandle
  7. end

其实就是在间隔一定时间后,将其停止,然后执行一次回调函数就可以了。


封装的最后一个是停止这些定时器,

    scheduler.unscheduleGlobal()

它的参数是前面那些定时器返回的句柄,所以如果需要在后面停止掉,记得在创建的留一个返回值就好了。


不过在游戏中,我们可能会做一个倒计时,也就是间隔一定时间调用指定的次数,这个是在quick中没有封装的,但是我们还是可以自己动手实现一下,原理也很简单,每次执行一次就计个数,达到指定的次数就停止定时器,

    localhandle
  1. localinterval=1
  2. localrepeatIndex=3
  3. localindex=0
  4. localsharedScheduler=CCDirector:sharedDirector():getScheduler()
  5. handle=sharedScheduler:scheduleScriptFunc(function()
  6. index=index+1
  7. ifindex>=repeatIndexthen
  8. end,interval,false)


效果如图



这样就ok了,大家可以自己试一试哈。

定时器就是这样子了。

原文地址:https://www.jb51.cc/cocos2dx/343329.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐