cocos2dx有限狀態機

在遊戲開發中,狀態機幾乎是必不可少的,簡單地說,狀態機就是控制遊戲對象在不同的狀態下應該做什麼事情的一個機制。



  1. #ifndef __MUTOU_H__  

  2. #define __MUTOU_H__  

  3.   

  4. #include "cocos2d.h"  

  5. USING_NS_CC;  

  6.   

  7. enum EnumState{  

  8.     enStateWriteCode,       /* 狀態:寫代碼 */  

  9.     enStateWriteArticle,    /* 狀態:寫教程 */  

  10.     enStateRest,            /* 狀態:休息 */  

  11. };  

  12.   

  13. class Mutou : public CCNode {  

  14. public:  

  15.     CREATE_FUNC(Mutou);  

  16.     virtual bool init();  

  17.   

  18.     /* 當前狀態 */  

  19.     EnumState enCurState;  

  20.   

  21.     /* 判斷是否寫代碼寫累了 */  

  22.     bool isTire();  

  23.   

  24.     /* 是否想寫教程 */  

  25.     bool isWantToWriteArticle();  

  26.   

  27.     /* 寫代碼 */  

  28.     void writeCode();  

  29.   

  30.     /* 寫教程 */  

  31.     void writeArticle();  

  32.   

  33.     /* 休息 */  

  34.     void rest();  

  35.   

  36.     /* 切換狀態 */  

  37.     void changeState(EnumState enState);  

  38. virtual void update(float dt);  

  39. };  

  40.   

  41. #endif  




  42. 輸出:

    mutou is wirting Code.

    mutou is resting.

    mutou is wirting Code.

    mutou is resting.

    mutou is writing article.

    mutou is resting.

    mutou is wirting Code.

    mutou is resting.

    mutou is wirting Code.


    有限狀態機的運用可以極大的簡化程序 讓代碼更加的清晰易懂 便於閱讀 當遊戲主角能根據當前狀態進行動作自動切換執行的時候可以極大的減少代碼量

    1. bool HelloWorld::init()  

    2. {  

    3.     bool bRet = false;  

    4.     do   

    5.     {  

    6.         CC_BREAK_IF(! CCLayer::init());  

    7.   

    8.         /* 新建木頭角色 */  

    9.         mMutou = Mutou::create();  

    10.   

    11.         /* 初始化木頭的狀態爲休息 */  

    12.         mMutou->changeState(enStateRest);  

    13.   

    14.         this->addChild(mMutou);  

    15.         bRet = true;  

    16.     } while (0);  

    17.   

    18.     return bRet;  

    19. }  

    20. #include "Mutou.h"  

    21.   

    22. bool Mutou::init(){  

    23.     this->scheduleUpdate();  

    24.     return true;  

    25. }  

    26.   

    27. void Mutou::changeState( EnumState enState ) {  

    28.     this->enCurState = enState;  

    29. }  

    30.   

    31. bool Mutou::isTire() {  

    32.     /* 每次問木頭累不累,他都會說:累~ */  

    33.     return true;  

    34. }  

    35.   

    36. bool Mutou::isWantToWriteArticle() {  

    37.     /* 有10%的概率想寫教程(好懶~!) */  

    38.     float ran = CCRANDOM_0_1();  

    39.     if(ran < 0.1f) {  

    40.         return true;  

    41.     }  

    42.   

    43.     return false;  

    44. }  

    45.   

    46. void Mutou::writeCode() {  

    47.     CCLOG("mutou is wirting Code.");  

    48. }  

    49.   

    50. void Mutou::writeArticle() {  

    51.     CCLOG("mutou is writing article.");  

    52. }  

    53.   

    54.   

    55. void Mutou::rest() {  

    56.     CCLOG("mutou is resting.");  

    57. }  

    58.   

    59. void Mutou::update( float dt ) {  

    60.     /* 判斷在每一種狀態下應該做什麼事情 */  

    61.     switch(enCurState) {  

    62.     case enStateWriteCode:  

    63.         /* 如果累了就休息,並且切換到休息狀態 */  

    64.         if(isTire()) {  

    65.             rest();  

    66.             changeState(enStateRest);  

    67.         }  

    68.         break;  

    69.     case enStateWriteArticle:  

    70.         /* 如果累了就休息,並且切換到休息狀態 */  

    71.         if(isTire()) {  

    72.             rest();  

    73.             changeState(enStateRest);  

    74.         }  

    75.         break;  

    76.     case enStateRest:  

    77.         /* 一定的概率寫代碼,一定的概率寫教程,並且切換到相應的狀態 */  

    78.         if(isWantToWriteArticle()) {  

    79.             writeArticle();  

    80.             changeState(enStateWriteArticle);  

    81.         }  

    82.         else {  

    83.             writeCode();  

    84.             changeState(enStateWriteCode);  

    85.         }  

    86.         break;  

    87.     }  

    88. }  



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章