Cocos2dx 3.x Lua 中使用定時器有兩種方式:函數
(1)self:scheduleUpdateWithPriorityLua(update, priority)lua
> 參數一:刷新函數spa
> 參數二:刷新優先級code
其中 self 爲 Node類 的子類。blog
該方法默認爲每幀都刷新一次,沒法自定義刷新時間間隔。ip
(2)scheduler:scheduleScriptFunc(update, inteval, false)ci
> 參數一:刷新函數get
> 參數二:每次刷新的時間間隔it
> 參數三:是否只執行一次。false爲無限次。io
其中 scheduler 爲定時器管理:cc.Director:getInstance():getScheduler()
推薦使用第二種方式,由於比較通用。
1.1 使用scheduleUpdateWithPriorityLua函數:
Link:
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軸位置:
|
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執行一次定時函數,與控制檯輸出吻合