Cocos2d-Lua 引擎中的调度器是用来周期执行某个函数或延时执行某个函数的。功能类似于定时触发器,但它又与游戏紧密结合。
Cocos2d-Lua 中的调度器分两种:
(1)全局调度器
(2)节点调度器
全局调度器
在游戏中,经常需要周期性的处理事务,并且这些事务不会因为某个节点的销毁而取消。比如在线游戏的网络心跳包,或某些全局变量的刷新。全局调度器用来解决这类问题。
全局调度器是Cocos2d-Lua 在Cocos2d-x的基础上提出来的,它基于schedule进行封装,让Lua可以脱离节点使用调度器。
Cocos2d-Lua框架默认不加载全局调度器模块,需要手动加载
全局调度器模块提供了三种调度器以满足各种需求:
(1)全局帧调度器: schduleUpdateGlobal(listener)
(2)全局自定义调度器:schduleGlobal(listener,interval)
(3)全局延时调度器:performWithDelayGlobal(listener,time)
前两个调度器的生命周期需要手动管理,全局延时调度器会在回调后自动销毁,但也不是所有情况下都可靠,引擎提供了一个注销调度器的接口:schduler.unschduleGlobal(handle).
1.全局帧调度器
顾名思义,全局帧调度器是游戏的每一帧都会触发的调度器。主要是在碰撞检测等每一帧都需要计算的地方。全局帧调度器不依赖任何场景,因此可以在整个游戏范围内实现较为精确的全局计时。
示例代码:
lcoal scheduler = require(cc.PACKAGE_NAME..".scheduler")
local function onInterval(dt)
print("update")
end
scheduler.scheduleUpdateGlobal(onInterval)
回调函数onInterval的参数dt,是两次调度之间的时间间隔。
2.全局自定义调度器
全局帧调度器是全局自定义调度器的特例,自定义调度器可以指定调度时间,提供更高的灵活性。
由于引擎的调度机制,自定义时间间隔必须大于两帧的间隔,否则两帧内的多次调用会被合并成一次调用。所以自定义时间间隔应在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.全局延时调度器
若在游戏中某些场合,只想实现一个单次的延时调用,就需要延迟调度器。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)节点帧调度器。节点帧调度器在Cocos2d-Lua中已归类到节点帧事件
(2)节点自定义调度器。
(3)节点延时调度器。
1、节点自定义调度器
由于引擎的调度机制,自定义时间间隔必须大于两帧的间隔,否则两帧内的多次调用会被合并成一次调用。所以自定义时间间隔应在0.1s以上(引擎默认每秒刷新60帧)
节点自定义调度器示例代码:
self:schdule(function() print ("schdule") end,1.0)
可以在Scene或Layer中调用上面的代码。
2、节点延时调度器
延时调度器等待指定的时间后执行一次回调函数,示例代码:
self:performWithDelay(function() print("performWithDelay") end , 1.0)