今天, 我們來看看cocos2dX裏面的定時器, 關於定時器這個概念大家應該很是熟悉吧, 所謂的定時器其實到了一個時間我們就幹什麼事, (旁白: 這還用你說), 在cocos2dX裏面定時器的作用就是每隔一段時間調用一次函數, schedule就是cocos2dX裏面的定時器, 老規矩, 還是來熟悉一下函數
scheduleUpdate 每幀執行update
schedule( "目標函數"); 每幀執行目標函數
schedule( "目標函數", "時間"); 每隔指定時間執行目標函數
schedule( "目標函數", "時間", "次數", "等待時間");
scheduleOnce( "目標函數", "等待時間"); 多久之後執行一次目標函數, 只執行一次
首先, 我們在頭文件裏面創建幾個回調函數:
void update( float delta);
void sch2( float delta);
void schonce( float delta);
並且創建兩個計數的變量:
int a;
int b;
int c;
然後我們初始化計數變量, 並且實現這幾個函數(函數的功能很簡單, 就是每調用一次, 就給對應的計數變量加一):
HelloWorld::HelloWorld()
{
<span style="white-space:pre"> </span>a = 0;
<span style="white-space:pre"> </span>b = 0;
<span style="white-space:pre"> </span>c = 0;
}
void HelloWorld::update( float delta)
{
<span style="white-space:pre"> </span>a += 1;
<span style="white-space:pre"> </span>char buff[50] = { 0};
<span style="white-space:pre"> </span>std::sprintf( buff, "update:%d", a);
<span style="white-space:pre"> </span>CCLabelTTF* label = ( CCLabelTTF*)this->getChildByTag( 101);<span style="white-space:pre"> </span>//通過我們設置的標籤取得對象, 並且強轉爲CCLabelTTF
<span style="white-space:pre"> </span>label->setString( buff);<span style="white-space:pre"> </span>//設置字符串
}
void HelloWorld::sch2( float delta)
{
<span style="white-space:pre"> </span>b += 1;
<span style="white-space:pre"> </span>char buff[50] = { 0};
<span style="white-space:pre"> </span>std::sprintf( buff, "sch2:%d", b);
<span style="white-space:pre"> </span>CCLabelTTF* label = ( CCLabelTTF*)this->getChildByTag( 102);
<span style="white-space:pre"> </span>label->setString( buff);
}
void HelloWorld::schonce( float delta)
{
<span style="white-space:pre"> </span>c += 1;
<span style="white-space:pre"> </span>char buff[50] = { 0};
<span style="white-space:pre"> </span>std::sprintf( buff, "schOnce:%d", c);
<span style="white-space:pre"> </span>CCLabelTTF* label = ( CCLabelTTF*)this->getChildByTag( 103);
<span style="white-space:pre"> </span>label->setString( buff);
}
我們再到init裏面創建三個標籤, 並且用三種不同的方式調用這三個函數:
CCLabelTTF* label1 = CCLabelTTF::create( "", "Arial", 24); //創建三個字符串
label1->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2 + 100));
addChild( label1, 0, 101);
CCLabelTTF* label2 = CCLabelTTF::create( "", "Arial", 24);
label2->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2));
addChild( label2, 0, 102);
CCLabelTTF* label3 = CCLabelTTF::create( "", "Arial", 24);
label3->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2 - 100));
addChild( label3, 0, 103);
scheduleUpdate(); //每一幀調用一次update
schedule( schedule_selector( HelloWorld::sch2), 1.0f); //每隔一秒調用一次sch2
scheduleOnce( schedule_selector( HelloWorld::schonce), 3.0f); //三秒之後調用schonce
我們來看看效果:
看看, 是不是每一幀都調用了一次update, 每一秒都調用了一次sch2, 只調用了一次schonce, 挺簡單的吧, 不用另開線程了吧( 旁白: 是挺簡單的)
當然, 還可以使用UnSchedule讓定時器停下來, 我就不做詳細解釋了, 還是那一句話, 多去看看官方的API
記住, 遊戲的速度再快, 我們都能處理到每一幀
好了, 進的就到這裏