COCOS學習筆記--schedule定時器

這篇博客介紹下Cocos2d-x的定時器。


一.首先問一個問題,什麼是定時器?定時器是幹什麼用的?

簡單來說,如果你想不斷去執行某個函數,或者每隔一段時間去執行一次某函數,甚至只執行一次,這時,我們就會用到定時器。比如在遊戲開發中每隔一段時間要刷新一些數據,或者要隨時間的變化而做一些邏輯判斷時,就常常用到定時器。

定時器就是指定時間間隔調用指定的函數,去完成特定的功能

Cocos2d-x定時器爲遊戲提供定時事件和定時調用服務。所有的Node對象都知道如何調度和取消調度對象,所以也有人管定時器叫調度器。


二.使用定時器有以下幾個好處:

1.每當Node不再可見或已從場景中移除時,定時器會停止。Cocos2d-x暫停時,定時器也會停止,比如Node被刪除或setVisible(false)時與其綁定的定時器會被停止,使用Director的Pause()方法暫停遊戲時定時器也會被停止掉;

2.當Cocos2d-x重新開始時,定時器也會自動繼續啓動,如執行Director的Resume()方法時;

3.Cocos2d-x封裝了一個供各種不同平臺使用的定時器,就是說cocos的定時器是跨平臺的。


三.Cocos2d-x調度器分3

默認調度器:scheduleUpdate()

自定義調度器:schedule()

單次調度器:scheduleOnce()


四.下面我們就來依次看看這3種調度器是怎麼使用的:


一).默認調度器:schedulerUpdate()

默認調度器使用Node的刷新事件update方法,該方法在每幀繪製之前都會被調用一次。

我們在使用默認調度器(schedulerUpdate)時候,需要重載Node的update方法來執行自己的邏輯代碼。如果需要停止這個調度器,可以使用unschedulerUpdate()方法。

接下來舉個例子來看看默認調度器的具體實現,新建一個cocos工程,我們只在HelloWorldScene.h和HelloWorldScene.cpp這兩個文件中做修改:

1).首先在頭文件HelloWorldScene.h裏聲明重寫的update方法,這個方法就是默認調度器的回調函數:

//聲明系統自帶的schedule回調函數
virtual void update(float t);

2).在HelloWorldScene.cpp文件中實現update方法,可以在該方法中執行我們自己的邏輯代碼,這裏我只做下打印:

//實現schedule的回調函數
void HelloWorld::update(float t)
{
log("update!");
}

3).通過scheduleUpdate()方法執行調度器,該方法是與其回調方法update()綁定到一起的,也就是說該方法一旦被某個Node執行,該Node的update()方法就會被執行,我把它寫在.cpp文件的 HelloWorld::init()方法中:

//執行系統調度器
this->scheduleUpdate();

運行結果:

 

可以看到,執行scheduleUpdate()方法後,update()回調方法會不斷執行打印,那麼這個update()回調方法多久執行一次呢?前面說了,該方法在每幀繪製之前都會被調用一次,所以理論上在無卡頓情況下每秒執行60次update()方法。


二).自定義調度器:schedule()

顧名思義,該調度器就是我們可以對調度進行相關屬性的自定義,比如調度事件觸發的時間間隔、觸發次數等等

舉個例子:

1).在.h文件中聲明自定義調度器的回調函數,注意該方法不是系統的而是我們自己寫的,所以方法名也是我們自己起的:

//聲明自定義調度器回調函數
virtual void customScheduleCallback(float t);

2)..cpp文件中實現剛剛聲明的回調函數,這裏也只做打印:

//實現回調函數
void HelloWorld::customScheduleCallback(float t)
{
log("customScheduleCallback!");
}

3).通過schedule()方法執行自定義調度器,該方法有4個參數:

schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)

參數1:selector爲要綁定的回調函數;

參數2:interval爲事件觸發時間間隔;

參數3:repeat爲觸發一次事件後還會觸發的次數,默認值爲kRepeatForever,表示無限觸發次數;

參數4:delay表示第一次觸發之前的延時。

我還把它寫在.cpp文件的 HelloWorld::init()方法中:

//執行自定義調度器
this->schedule(schedule_selector(HelloWorld::customScheduleCallback),2.0,5,3);

運行結果:

 

注意,第三個參數repeat值爲5,表示觸發一次事件後還會觸發5次,所以一共有6次打印,而且每一次打印輸出的時間間隔爲2秒。


三).單次調度器:scheduleOnce()

單次調度器只進行一次調度,即只執行一次回調函數。該調度器的使用方法和之前2種調度器基本一致,都是聲明回調方法、實現回調方法、使用調度器。

舉個例子:

1).在.h文件中聲明單次調度器的回調函數:

//聲明單次調度器回調函數
virtual void onceScheduleCallback(float t);

2).在.cpp文件中實現回調函數:

//實現回調函數
void HelloWorld::onceScheduleCallback(float t)
{
log("onceScheduleCallback!");
}

3).通過scheduleOnce()方法執行單次調度器,該方法有2個參數:

參數1:要綁定的回調函數

參數2:第一次觸發之前的延時

//執行單次調度器
this->scheduleOnce(schedule_selector(HelloWorld::onceScheduleCallback), 3);

運行結果:

 

可以看到,程序運行3秒後看到了一次打印輸出,之後便不再打印了。

 

最後,一句話總結,使用調度器無非就是使用3個方法:scheduleUpdate()、schedule()、scheduleOnce(),另外寫好需要綁定的回調函數,完事!




以上。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章