您的位置:首页 > 移动开发 > Cocos引擎

【Cocos2dx 3.3 Lua】定时器事件

2015-03-15 12:11 337 查看
Cocos2dx 3.x Lua 中使用定时器有两种方式:

(1)self:scheduleUpdateWithPriorityLua(update, priority)

> 参数一:刷新函数

> 参数二:刷新优先级

其中 self 为 Node类 的子类。

该方法默认为每帧都刷新一次,无法自定义刷新时间间隔。

(2)scheduler:scheduleScriptFunc(update, inteval, false)

> 参数一:刷新函数

> 参数二:每次刷新的时间间隔

> 参数三:是否只执行一次。false为无限次。

其中 scheduler 为定时器管理:cc.Director:getInstance():getScheduler()

推荐使用第二种方式,因为比较通用。

1.1 使用scheduleUpdateWithPriorityLua函数:

Link: http://codepad.org/xAJnPP88 [ raw code | fork ]

SpriteZOrderWithFrameCall=class("SpriteZOrderWithFrameCall",function()
return cc.Sprite:create()
end)

SpriteZOrderWithFrameCall.ctor=function(self)
self.zorder=1

local size=cc.Director:getInstance():getWinSize()
self:setPosition(size.width/2,size.height/2)
self:setScaleX(12)
end

SpriteZOrderWithFrameCall.init=function(self,texture)
self:setTexture(texture)
self:setLocalZOrder(self.zorder)
self:scheduleUpdateWithPriorityLua(function(dt)
self:schedule()
end,0)
end

SpriteZOrderWithFrameCall.schedule=function(self)
cclog("<SpriteZOrderWithFrameCall.schedule>")
local function reorderSprite()
cclog("call <reorderSprite>"..os.clock())
local order=self:getLocalZOrder()
if order < -1 then
self.zorder=1
elseif order >10 then
self.zorder=-1
end
self.zorder=self.zorder+3
self:setLocalZOrder(self.zorder)
end
reorderSprite()
end

SpriteZOrderWithFrameCall.create=function(self)
local sprite=self.new()
sprite:init("Images/grossini.png")
return sprite
end

return SpriteZOrderWithFrameCall


观察输出如下:



控制台输出:



根据图所示,scheduleUpdateWithPriorityLua 每帧都会调用,运行时帧率为60FPS/1s 也就是执行一帧的时间为0.017s与控制台输出时间吻合

1.2 使用scheduler:scheduleScriptFunc(update,interval,false)的实例如下:

定时调整精灵Z轴位置:

Link: http://codepad.org/HrpW9Cf9 [ raw code | fork ]
SpriteZOrder=class("SpriteZOrder",function()
return cc.Sprite:create()
end)

SpriteZOrder.ctor=function(self)
self.zorder=1

local size=cc.Director:getInstance():getWinSize()
self:setPosition(size.width/2,size.height/2)
self:setScaleX(12)
end

SpriteZOrder.init=function(self,texture)
self:setTexture(texture)
self:setLocalZOrder(self.zorder)
self:registerScriptHandler(function(tag)
local scheduler=nil
if tag=="enter" then
scheduler=self:onEnter()
elseif tag=="exit" then
self:onExit(scheduler)
end
end)
end

SpriteZOrder.onEnter=function(self)
cclog("<SpriteZOrder.onEnter>")
local function reorderSprite()
cclog("call <reorderSprite>"..os.clock())
local order=self:getLocalZOrder()
if order < -1 then
self.zorder=1
elseif order >10 then
self.zorder=-1
end
self.zorder=self.zorder+3
self:setLocalZOrder(self.zorder)
end

local scheduler=cc.Director:getInstance():getScheduler()
scheduler:scheduleScriptFunc(reorderSprite,2,false)
return scheduler
end

SpriteZOrder.onExit=function(self,scheduler)
cclog("<SpriteZOrder.onExit>")
if scheduler then
cc.Director:getInstance():getScheduler():unscheduleScriptEntry(scheduler)
end
end

SpriteZOrder.create=function(self)
local sprite=self.new()
sprite:init("Images/grossini.png")
return sprite
end

return SpriteZOrder


观察输出如下:



控制台输出:



scheduleScriptFunc可以设置定时时间,这里设置2s执行一次定时函数,与控制台输出吻合
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: