cocos2dx调度器schedule
Cocos2d-Lua 引擎中的调度器是用来周期执行某个函数或延时执行某个函数的。功能类似于定时触发器,但它又与游戏紧密结合。
schedule调度器利用了timer类来保存了调度任务的 时间线,重复次数,事件间隔,延迟等数据。timer把相关信息以结构体的形式存进了双向链表_hashForTimers中
每帧更新后Timer做事件累加,根据时间线去触发或者取消更新回调。
每帧更新每帧更新的回调放在 _hashForUpdates结构中以target作为key,同时根据优先级放在不同的hash表中。
自定义更新更新回调放在_hashForTimers hash表中,以target作为key.
每帧开始绘制之前执行Scheduler::update(float dt)
在里面遍历hash表,执行update更新回调,完成后移出。
按照优先级<0 ==0 >0 自定义更新的顺序遍历执行。
使用方法:Cocos2d-Lua 中的调度器分两种:全局调度器和节点调度器
全局调度器模块提供了三种调度器以满足各种需求:
(1)全局帧调度器: schduleUpdateGlobal(listener)
顾名思义,全局帧调度器是游戏的每一帧都会触发的调度器。主要是在碰撞检测等每一帧都需要计算的地方。全局帧调度器不依赖任何场景,因此可以在整个游戏范围内实现较为精确的全局计时。
示例代码:
lcoal scheduler = require(cc.PACKAGE_NAME..".scheduler")
local function onInterval(dt)
print("update")
end
scheduler.scheduleUpdateGlobal(onInterval)
回调函数onInterval的参数dt,是两次调度之间的时间间隔。
(2)全局自定义调度器:schduleGlobal(listener,interval)
全局帧调度器是全局自定义调度器的特例,自定义调度器可以指定调度时间,提供更高的灵活性。
由于引擎的调度机制,自定义时间间隔必须大于两帧的间隔,否则两帧内的多次调用会被合并成一次调用。所以自定义时间间隔应在1/60s以上(引擎默认每秒刷新60帧)
示例代码:
lcoal scheduler = require(cc.PACKAGE_NAME..".scheduler")
local function onInterval(dt)
print("Custom")
end
scheduler.scheduleGlobal(onInterval,0.5)
每隔0.5秒控制台输出信息。
(3)全局延时调度器:performWithDelayGlobal(listener,time)
若在游戏中某些场合,只想实现一个单次的延时调用,就需要延迟调度器。scheduler.performWithDelayGlobal()会在等待指定时间后执行一次回调函数,然后自动取消该scheduler。
示例代码:
lcoal scheduler = require(cc.PACKAGE_NAME..".scheduler")
local function onInterval(dt)
print("once")
end
scheduler.performWithDelayGlobal(onInterval,0.5)
在控制台只会看到一次输出。
节点调度器
Node是Cocos2d-Lua引擎中的基础类,它封装了很多基础方法与属性,其中调度器就是Node提供的方法之一。Node中的调度器只能在Node中使用,Node负责管理调度器的生命周期,当Node销毁的时候,会自动注销节点名下的所有调度器
1、节点自定义调度器
由于引擎的调度机制,自定义时间间隔必须大于两帧的间隔,否则两帧内的多次调用会被合并成一次调用。所以自定义时间间隔应在0.1s以上(引擎默认每秒刷新60帧)
节点自定义调度器示例代码:
self:schdule(function() print ("schdule") end,1.0)
可以在Scene或Layer中调用上面的代码。
2、节点延时调度器
延时调度器等待指定的时间后执行一次回调函数,示例代码:
self:performWithDelay(function() print("performWithDelay") end , 1.0)