激情六月丁香婷婷|亚洲色图AV二区|丝袜AV日韩AV|久草视频在线分类|伊人九九精品视频|国产精品一级电影|久草视频在线99|在线看的av网址|伊人99精品无码|午夜无码视频在线

高校合作1:010-59833514 ?咨詢電話:400-810-1418 服務(wù)與監(jiān)督電話:400-810-1418轉(zhuǎn)接2

談?dòng)螒驙顟B(tài)機(jī)的設(shè)計(jì)與實(shí)現(xiàn) 探討狀態(tài)機(jī)的擴(kuò)展性和易用性

發(fā)布時(shí)間:2024-03-08 15:38:17 瀏覽量:156次

前言:

游戲編程中對(duì)狀態(tài)機(jī)的理解和應(yīng)用,是體現(xiàn)程序員是否對(duì)游戲編程入門的重要指標(biāo)。本篇文章描述狀態(tài)機(jī)的原理,以及如何實(shí)現(xiàn)。并探討狀態(tài)機(jī)的擴(kuò)展性和易用性。

什么是狀態(tài)機(jī):

1、狀態(tài)機(jī)是通過狀態(tài)變量來描述不同狀態(tài)

2、狀態(tài)機(jī)變量是互斥的

3、狀態(tài)機(jī)的分割是狀態(tài)機(jī)好壞的標(biāo)準(zhǔn)

狀態(tài)機(jī)的好處:

1、降低整個(gè)系統(tǒng)的復(fù)雜性

2、容易擴(kuò)展

3、容易維護(hù)

如何實(shí)現(xiàn)狀態(tài)機(jī):

1、通過不同的狀態(tài)分割邏輯

2、通過面向?qū)ο笏枷雭頂U(kuò)展和分割邏輯

狀態(tài)機(jī)簡單類型:

1、定義狀態(tài)機(jī)類型

  1. enum PlayerState{

  2. INVALID,

  3. STAND,

  4. MOVE,

  5. ATTACK,

  6. DIE

  7. };

2、實(shí)現(xiàn)更新狀態(tài),在不同的狀態(tài)執(zhí)行不同的邏輯

  1. void Player::Update(float ts){

  2. switch(user_state_){

  3. case STAND:

  4. Stand(ts);

  5. break;

  6. case MOVE:

  7. Move(ts);

  8. break;

  9. case ATTACK:

  10. Attack(ts);

  11. break;

  12. case DIE:

  13. Die;

  14. return;

  15. default:

  16. std::cout<<"error\n";


  17. }


  18. if(hp_ <= 0){

  19. SetState(DIE);

  20. }

  21. }

3、切換狀態(tài),在切換狀態(tài)的時(shí)候做一些事情

  1. void Player::SetState(PlayerState state){

  2. if(state == user_state_){

  3. return;

  4. }

  5. switch(state){

  6. case STAND:

  7. std::cout << "----begin stand--------\n";

  8. break;

  9. case MOVE:

  10. std::cout << "----begin move--------\n";

  11. break;

  12. case ATTACK:

  13. std::cout << "----begin attack--------\n";

  14. break;

  15. case DIE:

  16. std::cout << "----begin die--------\n";

  17. break;

  18. default:

  19. std::cout <<"the state is error";

  20. break;

  21. }

  22. user_state_ = state;

  23. }

這種狀態(tài)機(jī)小而精悍,如果在一個(gè)對(duì)象中有很多標(biāo)志量來標(biāo)記實(shí)例的狀態(tài),這時(shí)候該考慮下通過這種小型的狀態(tài)機(jī)來實(shí)現(xiàn)了。但是這種狀態(tài)機(jī)如果狀態(tài)變量比較多,擴(kuò)展性并不好。并且復(fù)雜性會(huì)隨著狀態(tài)機(jī)的增多,指數(shù)型增加。整個(gè)編譯單元的代碼量也會(huì)很大,對(duì)易讀性和維護(hù)性都是負(fù)面影響。

狀態(tài)機(jī)面向?qū)ο箢愋停?/strong>

面向?qū)ο箢惖臓顟B(tài)機(jī)是一種更容易擴(kuò)展的新型狀態(tài)機(jī),通過單間實(shí)現(xiàn)方式,使用更少的內(nèi)存,先看下整個(gè)狀態(tài)機(jī)的uml設(shè)計(jì)圖。

首先是通過接口定義通用狀態(tài)機(jī)接口,然后定義了單間的接口。這種方式統(tǒng)一讓所有的狀態(tài)實(shí)現(xiàn)三個(gè)函數(shù),這三個(gè)函數(shù)分別對(duì)應(yīng)切入狀態(tài),在狀態(tài)中,退出狀態(tài),需要執(zhí)行的邏輯分別放在這三個(gè)函數(shù)里執(zhí)行,通過這樣的分割,狀態(tài)很容易擴(kuò)展,也不會(huì)混亂。具體代碼實(shí)現(xiàn),請(qǐng)看下面說面里面github的地址。

在StateManager是專門管理角色狀態(tài)的管理類,每個(gè)角色對(duì)象包含一個(gè)狀態(tài)機(jī)管理類。

總結(jié):

狀態(tài)機(jī)的模型是非常簡單,但并不是每個(gè)人都能設(shè)計(jì)好的狀態(tài)機(jī)。因?yàn)楹玫臓顟B(tài)機(jī)不僅需要對(duì)程序的把握要比較到位,同時(shí)需要對(duì)整個(gè)業(yè)務(wù)的理解比較到位。好的狀態(tài)機(jī)使程序變的更加簡潔,易擴(kuò)展,容易查找bug,還非常穩(wěn)定。壞得狀態(tài)分割只會(huì)讓程序晦澀難懂。

說明:

1、通過兩個(gè)狀態(tài)機(jī)實(shí)現(xiàn)了兩個(gè)簡單的猜數(shù)打怪獸游戲。

2、所有完整程序都可以到這個(gè)地址查看,下載,修改。

3、整個(gè)代碼都是通過C++ 完成的,編譯環(huán)境是osx 10.10 + LLVM 6.0 , C++使用 -std=c++1y。程序?qū)懥薽akefile,所以如果在其他平臺(tái)只需要簡單修改下makefile就可以快樂的玩耍了。

熱門課程推薦

熱門資訊

請(qǐng)綁定手機(jī)號(hào)

x

同學(xué)您好!

您已成功報(bào)名0元試學(xué)活動(dòng),老師會(huì)在第一時(shí)間與您取得聯(lián)系,請(qǐng)保持電話暢通!
確定