Cocos2d-x lua中的定时器

Cocos2d-x lua中的定时器,第1张

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

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

[HTML] view plain copy print ? 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使用中,我们使用定时器,无非就是每帧调用,间隔时间调用无数次,间隔时间调用指定次数,间隔时间调用一次,取消调用这几个。

我们依次来看下,

每帧调用,

[HTML] view plain copy print ? localtime=0 localfunctionupdate(dt) time=time+1 label:setString(string.format("%d",time)) end scheduler.scheduleUpdateGlobal(update)
    local time = 0    local function update(dt)        time = time + 1        label:setString(string.format("%d",time))    end    scheduler.scheduleUpdateGlobal(update)

间隔一定时间调用,

[HTML] view plain copy print ? localtime=0 localfunctiononInterval(dt) time=time+1 label:setString(string.format("%d",time)) end scheduler.scheduleGlobal(onInterval,1)
    local time = 0    local function onInterval(dt)        time = time + 1        label:setString(string.format("%d",time))    end    scheduler.scheduleGlobal(onInterval,1)


间隔时间调用一次,这个封装的不错,很常用 [HTML] view plain copy print ? localtime=0 localfunctiononInterval(dt) time=time+1 label:setString(string.format("%d",time)) print("over") end scheduler.performWithDelayGlobal(onInterval,1)
    local time = 0    local function onInterval(dt)        time = time + 1        label:setString(string.format("%d",time))        print("over")    end    scheduler.performWithDelayGlobal(onInterval,1)

可以看下这个是怎么实现的, [HTML] view plain copy print ? functionscheduler.performWithDelayGlobal(Listener,time) localhandle handle=sharedScheduler:scheduleScriptFunc(function() scheduler.unscheduleGlobal(handle) Listener() end,time,false) returnhandle end
function scheduler.performWithDelayGlobal(Listener,time)    local handle    handle = sharedScheduler:scheduleScriptFunc(function()        scheduler.unscheduleGlobal(handle)        Listener()    end,false)    return handleend

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


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

[HTML] view plain copy print ? scheduler.unscheduleGlobal()
scheduler.unscheduleGlobal()

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


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

[HTML] view plain copy print ? localhandle localinterval=1 localrepeatIndex=3 localindex=0 localsharedScheduler=CCDirector:sharedDirector():getScheduler() handle=sharedScheduler:scheduleScriptFunc(function() index=index+1 label:setString(string.format("%d",index)) ifindex>=repeatIndexthen scheduler.unscheduleGlobal(handle) print("over") end end,interval,false)
    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,false)


效果如图



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

定时器就是这样子了。


http://blog.csdn.net/w337198302/article/details/38677971

总结

以上是内存溢出为你收集整理的Cocos2d-x lua中的定时器全部内容,希望文章能够帮你解决Cocos2d-x lua中的定时器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1084967.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-27
下一篇2022-05-27

发表评论

登录后才能评论

评论列表(0条)

    保存