【Cocos2dx 3.3 Lua】定時器事件

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: 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執行一次定時函數,與控制檯輸出吻合

相關文章
相關標籤/搜索