發(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ī)類型
enum PlayerState{
INVALID,
STAND,
MOVE,
ATTACK,
DIE
};
2、實(shí)現(xiàn)更新狀態(tài),在不同的狀態(tài)執(zhí)行不同的邏輯
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);
}
}
3、切換狀態(tài),在切換狀態(tài)的時(shí)候做一些事情
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;
}
這種狀態(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就可以快樂的玩耍了。
熱門資訊
探討游戲引擎的文章,介紹了10款游戲引擎及其代表作品,涵蓋了RAGE Engine、Naughty Dog Game Engine、The Dead Engine、Cry Engine、Avalanche Engine、Anvil Engine、IW Engine、Frostbite Engine、Creation引擎、Unreal Engine等引擎。借此分析引出了游戲設(shè)計(jì)領(lǐng)域和數(shù)字藝術(shù)教育的重要性,歡迎點(diǎn)擊咨詢報(bào)名。
2. 手機(jī)游戲如何開發(fā)(如何制作傳奇手游,都需要準(zhǔn)備些什么?)
?如何制作傳奇手游,都需要準(zhǔn)備些什么?提到傳奇手游相信大家都不陌生,他是許多80、90后的回憶;從起初的端游到現(xiàn)在的手游,說明時(shí)代在進(jìn)步游戲在更新,更趨于方便化移動(dòng)化。而如果我們想要制作一款傳奇手游的
3. B站視頻剪輯軟件「必剪」:免費(fèi)、炫酷特效,小白必備工具
B站視頻剪輯軟件「必剪」,完全免費(fèi)、一鍵制作炫酷特效,適合新手小白??靵碓囋嚕?/span>
4. Steam值得入手的武俠游戲盤點(diǎn),各具特色的快意江湖
游戲中玩家將面臨武俠人生的掙扎抉擇,戰(zhàn)或降?殺或放?每個(gè)抉定都將觸發(fā)更多愛恨糾葛的精彩奇遇。《天命奇御》具有多線劇情多結(jié)局,不限主線發(fā)展,高自由...
5. Bigtime加密游戲經(jīng)濟(jì)體系揭秘,不同玩家角色的經(jīng)濟(jì)活動(dòng)
Bigtime加密游戲經(jīng)濟(jì)模型分析,探討游戲經(jīng)濟(jì)特點(diǎn),幫助玩家更全面了解這款GameFi產(chǎn)品。
6. 3D動(dòng)漫建模全過程,不是一般人能學(xué)的會(huì)的,會(huì)的多不是人?
步驟01:面部,頸部,身體在一起這次我不準(zhǔn)備設(shè)計(jì)圖片,我從雕刻進(jìn)入。這一次,它將是一種純粹關(guān)注建模而非整體繪畫的形式。像往常一樣,我從Sphere創(chuàng)建它...
7. 3D動(dòng)畫軟件你知道幾個(gè)?3ds Max、Blender、Maya、Houdini大比拼
當(dāng)提到3D動(dòng)畫軟件或動(dòng)畫工具時(shí),指的是數(shù)字內(nèi)容創(chuàng)建工具。它是用于造型、建模以及繪制3D美術(shù)動(dòng)畫的軟件程序。但是,在3D動(dòng)畫軟件中還包含了其他類型的...
8. 3D打印技巧揭秘!Cura設(shè)置讓你的模型更堅(jiān)固
想讓你的3D打印模型更堅(jiān)固?不妨嘗試一下Cura參數(shù)設(shè)置和設(shè)計(jì)技巧,讓你輕松掌握!
?三昧動(dòng)漫對(duì)于著名ARPG游戲《巫師》系列,最近CD Projekt 的高層回應(yīng)并不會(huì)推出《巫師4》。因?yàn)椤段讕煛废盗性诓邉澋臅r(shí)候一直定位在“三部曲”的故事框架,所以在游戲的出品上不可能出現(xiàn)《巫師4》
10. 如何自己開發(fā)一款游戲(游戲開發(fā)入門必看:五大獨(dú)立游戲開發(fā)技巧)
?游戲開發(fā)入門必看:五大獨(dú)立游戲開發(fā)技巧無論您是剛剛起步開發(fā)自己的第一款游戲,還是已經(jīng)制作了幾款游戲,本篇文章中的5大獨(dú)立游戲開發(fā)技巧都可以幫助您更好地設(shè)計(jì)下一款游戲。無論你對(duì)游戲有著什么樣的概念,都
最新文章
同學(xué)您好!