生活随笔
收集整理的這篇文章主要介紹了
cocos2d-x游戏循环与调度
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
每一個游戲程序都有一個循環在不斷運行,它是有導演對象來管理很維護。如果需要場景中的精靈運動起來,我們可以在游戲循環中使用定時器(Scheduler)對精靈等對象的運行進行調度。因為Node類封裝了Scheduler類,所以我們也可以直接使用Node中調用函數。
Node中調用函數主要有:
void scheduleUpdate ( void )。每個Node對象只要調用該函數,那么這個Node對象就會定時地每幀回調用一次自己的update(float dt)函數。
void schedule ( SEL_SCHEDULE?selector,? float? interval )。與scheduleUpdate函數功能一樣,不同的是我們可以指定回調函數(通過selector指定),也可以更加需要指定回調時間間隔。
void unscheduleUpdate ( void )。停止update(float dt)函數調度。
void unschedule ( SEL_SCHEDULE?selector )。可以指定具體函數停止調度。
void unscheduleAllSelectors ( void )??梢酝V拐{度。
?
為了進一步了解游戲循環與調度的使用,我們修改HelloWorld實例。
修改HelloWorldScene.h代碼,添加update(float dt)聲明,代碼如下:
?
[html]?view plaincopy
class?HelloWorld?:?public?cocos2d::Layer??{??public:?????...?...????????virtual?void?update(float?dt);??????????CREATE_FUNC(HelloWorld);?????};??修改HelloWorldScene.cpp代碼如下:??bool?HelloWorld::init()??{?????...?...??????????auto?label?=?LabelTTF::create("Hello?World","Arial",?24);?????label->setTag(123);???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????①?????...?...????????//更新函數??????this->scheduleUpdate();??????????????????????????????????????????????????????????????????????????????????????????????????????????????②?????//this->schedule(schedule_selector(HelloWorld::update),1.0f/60);??????????????????????????????????????????????③??????????return?true;??}?????voidHelloWorld::update(float?dt)??????????????????????????????????????????????????????????????????????????????????????????????????????④??{??????????auto?label?=this->getChildByTag(123);??????????????????????????????????????????????????????????????????????????????????⑤???????????label->setPosition(label->getPosition()+?Point(2,-2));???????????????????????????????????????????????????????????????????⑥??}??????void?HelloWorld::menuCloseCallback(Ref*pSender)??{??????//停止更新??????unscheduleUpdate();???????????????????????????????????????????????????????????????????????????????????????????????????????????⑦?????Director::getInstance()->end();?????#if?(CC_TARGET_PLATFORM?==CC_PLATFORM_IOS)?????exit(0);??#endif??}?? ?
?
為了能夠在init函數之外訪問標簽對象label,我們需要為標簽對象設置Tag屬性,其中的第①行代碼就是設置Tag屬性為123。第⑤行代碼是通過Tag屬性獲得重新獲得這個標簽對象。
為了能夠開始調度還需要在init函數中調用scheduleUpdate(見第②行代碼)或schedule(見第③行代碼)。
代碼第④行的HelloWorld::update(floatdt)函數是在調度函數,精靈等對象的變化邏輯都是在這個函數中編寫的。我們這個例子很簡單只是讓標簽對象動起來,第⑥行代碼就是改變它的位置。
為了省電等目的,如果不再使用調度,一定不要忘記停止調度。第⑦行代碼unscheduleUpdate()就是停止調度update,如果是其他的調度函數可以采用unschedule或unscheduleAllSelectors停止。
轉載于:https://www.cnblogs.com/iOS-Blog/p/3711263.html
總結
以上是生活随笔為你收集整理的cocos2d-x游戏循环与调度的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。