【Cocos2dx 3.3 Lua】定時器事件


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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM