cocos2dx中的scheduler

調度器(scheduler)是主要是爲遊戲提供定時事件和定時服務。常常用來遊戲的一些定時處理的功能,例如一些邏輯判斷,碰撞檢測等。
Cocos2dx提供了三種常用的調度器(scheduler)來讓我們使用

//默認調度器:
schedulerUpdate()
//自定義調度器:
schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)
//單次調度器:
scheduleOnce(SEL_SCHEDULE selector, float delay)

1默認調度器(schedulerUpdate)
默認調度器使用Node的刷新事件update方法,該方法在每幀繪製之前都會被調用一次。由於每幀之間時間間隔較短,所以每幀刷新一次已足夠完成大部分遊戲過程中需要的邏輯判斷。

我們在使用默認調度器(schedulerUpdate)時候,需要重載Node的update方法來執行自己的邏輯代碼。如果需要停止這個調度器,可以使用unschedulerUpdate()方法。
//取消默認調度
unschedulerUpdate()
使用時候首先在.h文件裏重寫update方法:void update(float dt) 。
在調用的地方直接使用scheduleUpdate()方法調用update的實現。

例如:

HelloWorldScene.h

void update(float dt) override;
HelloWorldScene.cpp

bool HelloWorld::init()
{
    ...
    scheduleUpdate();
    return true;
}

void HelloWorld::update(float dt)
{
    log("update");
}

結果:

cocos2d: update
cocos2d: update
cocos2d: update
cocos2d: update

2自定義調度器(scheduler)
有時候引擎自帶的調度器並不適合我們的需要,所以需要自己定義調度器。而cocos2dx則提供了此方法。
由於引擎的調度機制,自定義時間間隔必須大於兩幀的間隔,否則兩幀內的多次調用會被合併成一次調用。所以自定義時間間隔應在0.1秒以上

schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)
第一個參數selector即爲你要添加的事件函數。
第二個參數interval爲事件觸發時間間隔。
第三個參數repeat爲觸發一次事件後還會觸發的次數,默認值爲kRepeatForever,表示無限觸發次數。
//取消該調度器
unschedule(SEL_SCHEDULE selector, float delay)

以下是測試代碼

HelloWorldScene.h

void updateCustom(float dt);
HelloWorldScene.cpp

bool HelloWorld::init()
{
    ...
    schedule(schedule_selector(HelloWorld::updateCustom), 1.0f, kRepeatForever, 0);
    return true;
}

void HelloWorld::updateCustom(float dt)
{
    log("Custom");
}

在控制檯你會看到每隔1秒輸出以下信息

cocos2d: Custom
cocos2d: Custom
cocos2d: Custom
cocos2d: Custom
cocos2d: Custom

3.單次調度器(schedulerOnce)
遊戲中某些場合,你只想進行一次邏輯檢測,Cocos2d-x同樣提供了單次調度器。
該調度器只會觸發一次

//取消該觸發器
unschedule(SEL_SCHEDULE selector, float delay)

以下代碼用來測試該調度器:

HelloWorldScene.h

void updateOnce(float dt);
HelloWorldScene.cpp

bool HelloWorld::init()
{
    ...
    scheduleOnce(schedule_selector(HelloWorld::updateOnce), 0.1f);
    return true;
}

void HelloWorld::updateOnce(float dt)
{
    log("Once");
}

這次在控制檯你只會看到一次輸出

cocos2d: Once
scheduleOnce(SEL_SCHEDULE selector, float delay)
//第一個參數是執行的函數
//表示幾秒之後執行,並且只會執行一次

總結:
1.默認調度器:
直接調用schedulerUpdate() 函數,同時重寫update方法,這樣就是在用的地方直接使用scheduleUpdate()方法調用update的實現
2 自定義調度器:
調schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)函數 ,具體實現在selector函數中去執行
3.單次調度器:
調scheduleOnce(SEL_SCHEDULE selector, float delay)函數 ,具體實現在selector函數中去執行
補充:

 scheduler.unscheduleAllCallbacksForTarget(this);//取消指定節點的指定計劃
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章