關於Cocos2d-x中的scheduleUpdate和update方法的使用


一.如果要讓某類實例對象要連續執行某些語句(比如讓每個Block實例從運行框最右邊移動到最左邊)

要在Block類中增加一些東西

1.先在其.cpp文件的init()函數中執行scheduleUpdate()方法。

2.然后在.h中聲明一個虛擬的函數update,並在.cpp文件中定義update,當init中執行scheduleUpdate()時,會不斷地調用update函數,里面的語句也不斷地被執行,直到執行unscheduleUpdate()時停止調用update()函數,unscheduleUpdate()語句一般放在update函數中,當滿足某個條件時就執行。

 

 

二.如果要不斷地創建某個類的實例對象(比如不斷地創建新的Block在最右邊),可以用到嵌套的update方法

要在GameController類中增加一些東西

1.先在HelloWorld類的.cpp文件的init()函數中執行scheduleUpdate()方法。

2.然后在HelloWorld類的.h文件中聲明一個虛擬的函數update,並在.cpp文件中定義update,里面的語句也不斷地被執行,語句具體是去調用GameController實例中的onUpdate()函數。

void Game1::update(float dt){
  for (auto it = gcs.begin(); it != gcs.end(); it++) {
    (*it)->onUpdate();
}

3.再在GameController類的.h文件中聲明一個虛擬的函數onUpdate,並在.cpp文件中定義onUpdate,里面的語句也不斷地被執行,語句具體是創建一個Block類的實例對象。

4.但是不斷的調用的時間間隔是每一幀,可以說太快了,如果我們希望調用的時間間隔長一點或者時間間隔是隨機的,我們就要在GameController類的.h文件里面再定義兩個屬性,frameIndex和nextKeyFrameIndex,再聲明一個函數resetTimer,這個函數用來重置當前幀和下一次調用onUpdate函數時的幀數,這個是隨機的,一般情況下1秒等於60幀,所以下面那個定義意思就是2秒到4秒之間的一個時間會調用onUpdate函數

void GameController::resetTimer(){
  frameIndex = 0;
  nextKeyFrameIndex = rand()%120+120;
}

void GameController::onUpdate(){

  frameIndex++;

  if (frameIndex>=nextKeyFrameIndex) {    //當當前幀數等於或大於隨機的目的幀數時,創建Block並重置frameIndex和nextKeyFrameIndex

  auto b = game::Block::create();
  _layer->addChild(b);
  b->setPositionY(_positionY+b->getContentSize().height/2);

  resetTimer();
  }
}

5.游戲結束的時候要把這個一直執行的update停掉,用到unscheduleUpdate(),一般是放在一些事件監聽的函數中

 

 

三.如果要指定一定的時間間隔去調用某個方法用

schedule(schedule_selector(PlaneHero::beginShooting),.5f);

這里的.5f其實就等於0.5f,而且這個參數是以秒為單位的,也就是說,每格0.5秒去調用這個beginShooting方法,達到我們想要的射子彈的效果。

 


免責聲明!

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



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