cocos2dx--定时器封装

来源:互联网 发布:vue index.html引入js 编辑:程序博客网 时间:2024/04/30 01:39

–[[ 定时器管理 –]]

local ManagerScheduler = {}
local sharedScheduler = cc.Director:getInstance():getScheduler()

ManagerScheduler._heartTime = 2 –心跳包检测时间
ManagerScheduler._listener = {} –加入监听对象

–[[
全局监听:用于内存检测\心跳包\网络等情况等与场景无关事件
–]]
function ManagerScheduler:startGolbalScheduler()
self._heartBeatHandle = self:scheduleGlobal(function ()
self:checkMemory()
end, self._heartTime)
end
–[[
移除全局监听
–]]
function ManagerScheduler:stopGolbalScheduler()
if self._heartBeatHandle then
self:unscheduleGlobal(self._heartBeatHandle)
self._heartBeatHandle = nil
end
end
–[[
监听对象存在时才执行
@params:参数说明
layer:监听对象
interval:时间间隔
listener:监听回调 默认值:updateTimeCallBack
extraParams :返回数据
mutiName :针对多个定时器加个字段做回调区分
–]]
function ManagerScheduler:insertLocalScheduler(params, mutiName)
assert(type(params) == “table”,”ManagerScheduler:insertLocalScheduler 参数类型错误”)
mutiName = mutiName or 1
self:removeLocalScheduler(params, mutiName)

self._listener[params.layer] = self._listener[params.layer] or {}params.interval = params.interval or 1params.listener = params.listener or function () self:updateTimeCallBack(params, mutiName) endself._listener[params.layer][mutiName] = self:scheduleGlobal(params.listener, params.interval)  return self._listener[params.layer][mutiName]

end

–[[
对象被移除后移除监听
–]]
function ManagerScheduler:removeLocalScheduler(params, mutiName)
if not self._listener[params.layer] then return end
if not mutiName then
for i , v in pairs(self._listener[params.layer]) do
if self._listener[params.layer] and self._listener[params.layer][i] then
self:unscheduleGlobal(self._listener[params.layer][i])
end
self._listener[params.layer][i] = nil
end
self._listener[params.layer] = nil
else
if self._listener[params.layer] and self._listener[params.layer][mutiName] then
self:unscheduleGlobal(self._listener[params.layer][mutiName])
end
self._listener[params.layer][mutiName] = nil

    if _G.next( self._listener[params.layer]) == nil then        self._listener[params.layer] = nil    endend-- dump(self._listener, "self._listener")

end
function ManagerScheduler:updateTimeCallBack(params , mutiName)
if params.layer and params.layer.updateTimeCallBack then
params.layer:updateTimeCallBack(params.interval, params.extraParams , mutiName)
end
end
– function ManagerScheduler:getListenerLayerID(layer)
– for i,v in pairs(self._listener) do
– if i == layer then
– return v
– end
– end
– return false
– end

function ManagerScheduler:checkMemory()
collectgarbage(“collect”)
collectgarbage(“collect”)
collectgarbage(“collect”)
print(“memorey ” .. collectgarbage(“count”))
end

– start –
–[[
计划一个全局帧事件回调,并返回该计划的句柄。
@function [parent=#scheduler] scheduleUpdateGlobal
@param function 回调函数
@return mixed#mixed ret (return value: mixed) schedule句柄
– ]]
function ManagerScheduler:scheduleUpdateGlobal(listener)
return sharedScheduler:scheduleScriptFunc(listener, 0, false)
end

–[[
计划一个以指定时间间隔执行的全局事件回调,并返回该计划的句柄。
@function [parent=#scheduler] scheduleGlobal
@param function listener 回调函数
@param number interval 间隔时间
@return mixed#mixed ret (return value: mixed) schedule句柄
–]]

function ManagerScheduler:scheduleGlobal(listener, interval)
return sharedScheduler:scheduleScriptFunc(listener, interval, false)
end

–[[
取消一个全局计划
@function [parent=#scheduler] unscheduleGlobal
@param mixed schedule句柄
–]]
function ManagerScheduler:unscheduleGlobal(handle)
sharedScheduler:unscheduleScriptEntry(handle)
end

–[[
计划一个全局延时回调,并返回该计划的句柄。
@function [parent=#scheduler] performWithDelayGlobal
@param function listener 回调函数
@param number time 延迟时间
@return mixed#mixed ret (return value: mixed) schedule句柄
–]]
function ManagerScheduler:performWithDelayGlobal(listener, time)
local handle
handle = sharedScheduler:scheduleScriptFunc(function()
self:unscheduleGlobal(handle)
listener()
end, time, false)
return handle
end

return ManagerScheduler

使用说明:(支持同一个UI多个定时器)
–添加定时器

ManagerScheduler:insertLocalScheduler({layer = self,interval = 1,extraParams = {}}, "updateLeftTime")ManagerScheduler:insertLocalScheduler({layer = self, interval = 2,}, "dispathCard")

–[[
监听定时器调度返回总口
–]]
function GameTableUI:updateTimeCallBack(dt,extraParams, mutiName)
if mutiName == “updateLeftTime” then
–移除定时器
ManagerScheduler:removeLocalScheduler({layer = self}, “updateLeftTime”)
elseif mutiName == “dispathCard” then
ManagerScheduler:removeLocalScheduler({layer = self}, “dispathCard”)
end
end

0 0
原创粉丝点击