cocos2d-x遊戲循環與調度

每個遊戲程序都有一個循環在不斷運行,它是有導演對象來管理很維護。若是須要場景中的精靈運動起來,咱們能夠在遊戲循環中使用定時器(Scheduler)對精靈等對象的運行進行調度。由於Node類封裝了Scheduler類,因此咱們也能夠直接使用Node中調用函數。

Node中調用函數主要有:html

void scheduleUpdate ( void )。每一個Node對象只要調用該函數,那麼這個Node對象就會定時地每幀回調用一次本身的update(float dt)函數。函數

void schedule ( SEL_SCHEDULE selector,  float  interval )。與scheduleUpdate函數功能同樣,不一樣的是咱們能夠指定回調函數(經過selector指定),也能夠更加須要指定回調時間間隔。this

void unscheduleUpdate ( void )。中止update(float dt)函數調度。spa

void unschedule ( SEL_SCHEDULE selector )。能夠指定具體函數中止調度。.net

void unscheduleAllSelectors ( void )。能夠中止調度。code

 

爲了進一步瞭解遊戲循環與調度的使用,咱們修改HelloWorld實例。orm

修改HelloWorldScene.h代碼,添加update(float dt)聲明,代碼以下:htm

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片對象

  1. class HelloWorld : public cocos2d::Layer  blog

  2. {  

  3. public:  

  4.    ... ...  

  5.    

  6.    virtual void update(float dt);  

  7.      

  8.    CREATE_FUNC(HelloWorld);  

  9.    

  10. };  

  11. 修改HelloWorldScene.cpp代碼以下:  

  12. bool HelloWorld::init()  

  13. {  

  14.    ... ...  

  15.      

  16.    auto label = LabelTTF::create("Hello World","Arial", 24);  

  17.    label->setTag(123);                                                                                                                       ①  

  18.    ... ...  

  19.    

  20.    //更新函數   

  21.    this->scheduleUpdate();                                                                                                              ②  

  22.    //this->schedule(schedule_selector(HelloWorld::update),1.0f/60);                                              ③  

  23.      

  24.    return true;  

  25. }  

  26.    

  27. voidHelloWorld::update(float dt)                                                                                                      ④  

  28. {      

  29.     auto label =this->getChildByTag(123);                                                                                  ⑤       

  30.     label->setPosition(label->getPosition()+ Point(2,-2));                                                                   ⑥  

  31. }   

  32.    

  33. void HelloWorld::menuCloseCallback(Ref*pSender)  

  34. {  

  35.     //中止更新   

  36.    unscheduleUpdate();                                                                                                           ⑦  

  37.    Director::getInstance()->end();  

  38.    

  39. #if (CC_TARGET_PLATFORM ==CC_PLATFORM_IOS)  

  40.    exit(0);  

  41. #endif  

  42. }  


爲了可以在init函數以外訪問標籤對象label,咱們須要爲標籤對象設置Tag屬性,其中的第①行代碼就是設置Tag屬性爲123。第⑤行代碼是經過Tag屬性得到從新得到這個標籤對象。

爲了可以開始調度還須要在init函數中調用scheduleUpdate(見第②行代碼)或schedule(見第③行代碼)。

代碼第④行的HelloWorld::update(floatdt)函數是在調度函數,精靈等對象的變化邏輯都是在這個函數中編寫的。咱們這個例子很簡單只是讓標籤對象動起來,第⑥行代碼就是改變它的位置。

爲了省電等目的,若是再也不使用調度,必定不要忘記中止調度。第⑦行代碼unscheduleUpdate()就是中止調度update,若是是其餘的調度函數能夠採用unschedule或unscheduleAllSelectors中止。

相關文章
相關標籤/搜索