Cocos2dx 3.x Lua 中使用定时器有两种方式:
(1)self:scheduleUpdateWithPriorityLua(update, priority)
> 参数一:刷新函数
> 参数二:刷新优先级
其中 self 为 Node类 的子类。
该方法默认为每帧都刷新一次,无法自定义刷新时间间隔。
(2)scheduler:scheduleScriptFunc(update, inteval, false)
> 参数一:刷新函数
> 参数二:每次刷新的时间间隔
> 参数三:是否只执行一次。false为无限次。
其中 scheduler 为定时器管理:cc.Director:getInstance():getScheduler()
推荐使用第二种方式,因为比较通用。
在 引擎根目录/cocos/scripting/lua-bindings/script 的extern.lua文件中定义了 schedule 和 performWithDelay 两个函数:
其中scheduleScriptFunc的 scheduleScriptFunc)是返回值是一个定时器凭据,该凭据用于在需要删除对应的定时器时传入作为参数,正如上面的例子代码所示。
注意:定义的定时器,必须要删除,实例代码实现背景的滚动
滚动背景:
function SyMapScene:createBg()
local bg = cc.Sprite:create("map.png")
bg:setAnchorPoint(0,0)
bg:setPosition(0,0)
local bg2 = cc.Sprite:create("map.png")
bg2:setAnchorPoint(0,0)
bg2:setPosition(0, bg:getContentSize().height - 2)
local function bgMove()
bg:setPositionY(bg:getPositionY() - 1)
bg2:setPositionY(bg2:getPositionY() - 1)
if (bg:getPositionY() < - bg:getContentSize().height) then
bg:setPositionY(bg2:getPositionY() + bg2:getContentSize().height)
elseif (bg2:getPositionY() <- bg2:getContentSize().height) then
bg2:setPositionY(bg:getPositionY() + bg:getContentSize().height)
schedulerID = cc.Director:getInstance():getScheduler():scheduleScriptFunc(bgMove, 0, false)
return bg,bg2
end
必须在场景退出的时候删除,否则在场景切换到下一个场景的时候会报一下错误:
LUA ERROR: [string "SyMap.lua"]:37: invalid 'cobj' in function 'lua_cocos2dx_Node_getPositionY'
这是一个类似于空指针的错误,Node已经手动死亡之后依然会调用Node,定时调用依旧在生效即在调用。
场景退出的时候取消调用;
function SyMapScene:onExit()
cc.Director:getInstance():getScheduler():unscheduleScriptEntry(schedulerID)
或者直接使用第一种调用方式:
self:scheduleUpdateWithPriorityLua(bgMove,0)
不必手动删除schedule的调用,在场景切换到下一个场景的时候不会报错。
二:关于 invalid 'cobj' in function 错误:
这是因为对一个Node调用其函数时其已经被GC了。
在cocos2d-x3.x lua脚本中,原来引擎中的那些添加定时器的函数(schedule)没有自动绑定过来,而是引擎团队重新定义的,这里做个汇总,在 引擎根目录/cocos/scripting/lua-bindings/script 的extern.lua文件中定义了 schedule 和 performWithDelay 两个函数:function schedule(node, callback, delay)
定时器用的地方还是比较多的,游戏中的逻辑判断很多都是采用每帧执行。quick对于schedule的封装在scheduler这个lua文件中。如果是第一次接触quick的话,可能按照官方的api来写一个定时器被报错,提示schedule是一个nil值,这是因为其他的模块在初始化时都是被加载的,唯独这个scheduler没有载入,所以在使用的时候,第一件事是引入这个模块,
local schedul
Cocos2dx 3.x
Lua 中定时器的两种使用方式:
(1)self:
scheduleUpdateWithPriority
Lua(update, priority)
> 参数一:刷新函数
> 参数二:刷新优先级
其
中 self 为 Node类 的子类。
该方法默认为每帧都刷新一次,无法自定义刷新时间间隔。
(2)
scheduler:
scheduleScriptFunc(update, inteval, false)
Cocos2dx 3.x Lua 中使用定时器有两种方式:
(1)self:scheduleUpdateWithPriorityLua(update, priority)
> 参数一:刷新函数
> 参数二:刷新优先级
其中 self 为 Node类 的子类。
该方法默认为每帧都刷新一次,无法...
1.update
定时器
第一种定时机制是Node类的刷新事件update方法,该方法在每帧绘制之前都会被触发一次。由于绘图帧率有限,而每次更新最终会反映到画面上,所以在每帧之间刷新一次已经足够应付大部分游戏逻辑处理的要求了。
cocos2d-x默认没有启用update事
打开一个定时器:schedulerID = cc.Director:getInstance():getScheduler():scheduleScriptFunc(调用的function, 定时时间(秒), 是否暂停(true, false))
关闭定时器:cc.Director:getInstance():getScheduler():unscheduleScriptEntry(schedul...
注:本文开始,引擎升级到
cocos2dx 3.6
在游戏开发过程
中,经常会遇到使用计时器的情况,例如:倒计时,定时炸弹等。
scheduler是
cocos2dx 2.x时代就已经存在的产物,主要用于各种延时函数以及各种每帧运行的函数。本文主要介绍
scheduler的API函数以及使用方法。
首先,所有继承Node的类都可以使用
scheduler,以下是Node类下相关API的介绍
1.scheduler.scheduleUpdateGlobal(listener) -- 全局帧事件回调 实际上就是 sharedScheduler:scheduleScriptFunc(listener, 0, false)
2.scheduler.scheduleGlobal(listener, interval) -- 全局事件回调 interval 是间隔时间 单位:s 实际上
这里只说一种调度:
cc.Director:getInstance():get
Scheduler()
完整代码如下:local sche = cc.Director:getInstance():get
Scheduler()
local schNode = nil
function aLayer:updateSche(bUpdate