遊戲編程中對狀態機的理解和應用,是體現程序員是否對遊戲編程入門的重要指標。本篇文章描述狀態機的原理,以及如何實現。並探討狀態機的擴展性和易用性。
什麼是狀態機:
1、狀態機是通過狀態變量來描述不同狀態
2、狀態機變量是互斥的
3、狀態機的分割是狀態機好壞的標準
狀態機的好處:
1、降低整個系統的複雜性
2、容易擴展
3、容易維護
如何實現狀態機:
1、通過不同的狀態分割邏輯
2、通過面向對象思想來擴展和分割邏輯
狀態機簡單類型:
1、定義狀態機類型
- enum PlayerState{
- INVALID,
- STAND,
- MOVE,
- ATTACK,
- DIE
- };
2、實現更新狀態,在不同的狀態執行不同的邏輯
- void Player::Update(float ts){
- switch(user_state_){
- case STAND:
- Stand(ts);
- break;
- case MOVE:
- Move(ts);
- break;
- case ATTACK:
- Attack(ts);
- break;
- case DIE:
- Die();
- return;
- default:
- std::cout<<"error\n";
- }
- if(hp_ <= 0){
- SetState(DIE);
- }
- }
- void Player::SetState(PlayerState state){
- if(state == user_state_){
- return;
- }
- switch(state){
- case STAND:
- std::cout << "----begin stand--------\n";
- break;
- case MOVE:
- std::cout << "----begin move--------\n";
- break;
- case ATTACK:
- std::cout << "----begin attack--------\n";
- break;
- case DIE:
- std::cout << "----begin die--------\n";
- break;
- default:
- std::cout <<"the state is error";
- break;
- }
- user_state_ = state;
- }
這種狀態機小而精悍,如果在一個對象中有很多標誌量來標記實例的狀態,這時候該考慮下通過這種小型的狀態機來實現了。但是這種狀態機如果狀態變量比較多,擴展性並不好。並且複雜性會隨着狀態機的增多,指數型增加。整個編譯單元的代碼量也會很大,對易讀性和維護性都是負面影響。
狀態機面向對象類型:
面向對象類的狀態機是一種更容易擴展的新型狀態機,通過單間實現方式,使用更少的內存,先看下整個狀態機的uml設計圖。
什麼是狀態機:
1、狀態機是通過狀態變量來描述不同狀態
2、狀態機變量是互斥的
3、狀態機的分割是狀態機好壞的標準
狀態機的好處:
1、降低整個系統的複雜性
2、容易擴展
3、容易維護
如何實現狀態機:
1、通過不同的狀態分割邏輯
2、通過面向對象思想來擴展和分割邏輯
狀態機簡單類型:
1、定義狀態機類型
- enum PlayerState{
- INVALID,
- STAND,
- MOVE,
- ATTACK,
- DIE
- };
2、實現更新狀態,在不同的狀態執行不同的邏輯
- void Player::Update(float ts){
- switch(user_state_){
- case STAND:
- Stand(ts);
- break;
- case MOVE:
- Move(ts);
- break;
- case ATTACK:
- Attack(ts);
- break;
- case DIE:
- Die();
- return;
- default:
- std::cout<<"error\n";
- }
- if(hp_ <= 0){
- SetState(DIE);
- }
- }
- void Player::SetState(PlayerState state){
- if(state == user_state_){
- return;
- }
- switch(state){
- case STAND:
- std::cout << "----begin stand--------\n";
- break;
- case MOVE:
- std::cout << "----begin move--------\n";
- break;
- case ATTACK:
- std::cout << "----begin attack--------\n";
- break;
- case DIE:
- std::cout << "----begin die--------\n";
- break;
- default:
- std::cout <<"the state is error";
- break;
- }
- user_state_ = state;
- }
這種狀態機小而精悍,如果在一個對象中有很多標誌量來標記實例的狀態,這時候該考慮下通過這種小型的狀態機來實現了。但是這種狀態機如果狀態變量比較多,擴展性並不好。並且複雜性會隨着狀態機的增多,指數型增加。整個編譯單元的代碼量也會很大,對易讀性和維護性都是負面影響。
狀態機面向對象類型:
面向對象類的狀態機是一種更容易擴展的新型狀態機,通過單間實現方式,使用更少的內存,先看下整個狀態機的uml設計圖。