定時器用的地方還是比較多的,遊戲中的邏輯判斷很多都是採用每幀執行。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)