一.如果要讓某類實例對象要連續執行某些語句(比如讓每個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方法,達到我們想要的射子彈的效果。