cocos lua 定时器相关

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

local scheduler = 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使用中,我们使用定时器,无非就是每帧调用,间隔时间调用无数次,间隔时间调用指定次数,间隔时间调用一次,取消调用这几个。

 

每帧调用

local time = 0  

local function update(dt)  

    time = time + 1  

    label:setString(string.format("%d", time))  

end  

scheduler.scheduleUpdateGlobal(update)

 

 

间隔一定时间调用

--

local time = 0  

local function onInterval(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))  

    print("over")  

end  

   

scheduler.performWithDelayGlobal(onInterval, 1)

 

 

 

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

  

function scheduler.performWithDelayGlobal(listener, time)  

    local handle  

    handle = sharedScheduler:scheduleScriptFunc(function()  

        scheduler.unscheduleGlobal(handle)  

        listener()  

    end, time, false)  

    return handle  

end

 

 

其实就是在间隔一定时间后,将其停止,然后执行一次回调函数就可以了。封装的最后一个是停止这些定时器

scheduler.unscheduleGlobal()

 

 

 

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

---------------------

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

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)

 

posted on 2020-03-10 18:02  TaoTao大魔王  阅读(390)  评论(0编辑  收藏  举报