quick-cocos2d-x遊戲開發【7】——定時器,cocos2dx定時器

來源:互聯網
上載者:User

quick-cocos2d-x遊戲開發【7】——定時器,cocos2dx定時器

定時器用的地方還是比較多的,遊戲中的邏輯判斷很多都是採用每幀執行。quick對於schedule的封裝在scheduler這個lua檔案中。如果是第一次接觸quick的話,可能按照官方的api來寫一個定時器被報錯,提示schedule是一個nil值,這是因為其他的模組在初始化時都是被載入的,唯獨這個scheduler沒有載入,所以在使用的時候,第一件事是引入這個模組,

local scheduler = require("framework.scheduler")

剩下的就可以看著api來寫了,在寫quick的定時器之前還是再複習一下cocos2dx原生lua對於定時器的寫法。

每幀調用的,

void scheduleUpdateWithPriority (int priority)

void scheduleUpdateWithPriorityLua (int nHandler,int priority)


指定調用間隔時間的,

unsigned int scheduleScriptFunc (unsigned int nHandler, float fInterval, bool bPaused)


還有取消定時器事件

void unscheduleScriptEntry (unsigned int uScheduleScriptEntryID)


quick的scheduler主要是對後面兩個函數的封裝。在c++的cocos使用中,我們使用定時器,無非就是每幀調用,間隔時間調用無數次,間隔時間調用指定次數,間隔時間調用一次,取消調用這幾個。

我們依次來看下,

每幀調用,

    local time = 0    local function update(dt)        time = time + 1        label:setString(string.format("%d", time))    end    scheduler.scheduleUpdateGlobal(update)

間隔一定時間調用,

    local time = 0    local function onInterval(dt)        time = time + 1        label:setString(string.format("%d", time))    end    scheduler.scheduleGlobal(onInterval, 1)


間隔時間調用一次,這個封裝的不錯,很常用

    local time = 0    local function onInterval(dt)        time = time + 1        label:setString(string.format("%d", time))        print("over")    end    scheduler.performWithDelayGlobal(onInterval, 1)

可以看下這個是怎麼實現的,

function scheduler.performWithDelayGlobal(listener, time)    local handle    handle = sharedScheduler:scheduleScriptFunc(function()        scheduler.unscheduleGlobal(handle)        listener()    end, time, false)    return handleend

其實就是在間隔一定時間後,將其停止,然後執行一次回呼函數就可以了。


封裝的最後一個是停止這些定時器,

scheduler.unscheduleGlobal()

它的參數是前面那些定時器返回的控制代碼,所以如果需要在後面停止掉,記得在建立的留一個返回值就好了。


不過在遊戲中,我們可能會做一個倒計時,也就是間隔一定時間調用指定的次數,這個是在quick中沒有封裝的,但是我們還是可以自己動手實現一下,原理也很簡單,每次執行一次就計個數,達到指定的次數就停止定時器,

    local handle    local interval = 1    local repeatIndex = 3    local index = 0    local sharedScheduler = CCDirector:sharedDirector():getScheduler()    handle = sharedScheduler:scheduleScriptFunc(function()        index = index + 1        label:setString(string.format("%d", index))        if index >= repeatIndex then            scheduler.unscheduleGlobal(handle)            print("over")        end    end, interval, false)


效果



這樣就ok了,大家可以自己試一試哈。

定時器就是這樣子了。



s7 300定時器怎設定時間

調用接通延時的時間繼電器,分配T幾,然後在時間輸入裡比如要定時1分30秒,直接輸入S5T#1M30S,如果是1小時23分37秒,則寫入S5T#1H23M37S,即以S5T#為首碼,後面直接跟幾時幾分幾秒
 
S7-300中的PLC定時器指令採用了( )觸發

選A

西門子 S7-300/400 定時器的區別
SIEMENS S7-300/400系列PLC共有5種定時器指令,它們是:S_PULSE(脈衝定時器)、S_PEXT(擴充脈衝定時器)、S_ODT(接通延時定時器)、S_ODTS(保持型接通延時定時器)、S_OFFDT(斷電延時定時器)。下面分別說明這5種定時器指令的區別。

1、S_PULSE(脈衝定時器)

其工作特點為:輸入為1,定時器開始計時,定時位為1;計時時間到,定時器停止工作,定時位為0。如在定時時間未到時,輸入變為0,則定時器停止工作,定時器位為變為0。

2、S_PEXT(擴充脈衝定時器)

其工作特點為:輸入從0→1時,定時器開始工作計時,定時器位為1;定時時間到,定時器位為0。在定時過程中,輸入訊號斷開不影響定時器的計時(定時器繼續計時)。
3、S_ODT(接通延時定時器)

其工作特點為:輸入訊號為1,定時器開始計時(定時器位為0);計時時間到,定時器位為1。計時時間到後,若輸入訊號斷開,則定時器位變為0。如在計時時間未到時,輸入訊號變為0,則定時器停止計時。
4、S_ODTS(保持型接通延時定時器)

其工作特點為:輸入訊號為1,定時器開始工作並計時,計時時間到,定時器位為1。輸入訊號只起一個觸發定時器工作的作用,在計時過程中輸入訊號斷開不影響定時器計時和定時器位。定時器位只有使用複位指令才能變為0並觸發下一個定時器定時工作。
5、S_OFFDT(斷電延時定時器)

其工作特點為:輸入訊號由0→1時,定時器位為1(但定時器不開始計時);當輸入訊號由1→0時,定時器才開始計時,計時時間到,定時器位變為0。在計時過程中,輸入訊號由0→1將複位定時器,當由1→0時重新開始計時。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.