Cocos2d-Lua 调度器

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)


你可能感兴趣的:(Cocos2d-Lua)