0

我有我的NPC,其構造類似下面的狀態機處理事件,在狀態機

execute state 
[[[pred1 pred2....] state1] 
[[pred3 pred4....] state2] 
[[pred5 pred6....] staten]] 

會發生什麼是當前的狀態完成後,它開始通過美國/謂詞列表和迭代儘快返回全部爲true的謂詞列表將跳轉到與之相關聯的狀態。

某些事件可能發生在所有狀態,比如玩家命令npc去某個地方。就像任何其他狀態轉換一樣,我可以檢查謂詞並更改狀態,但是將相同的代碼添加到每個狀態似乎有點跛腳。所以我想知道人們如何處理狀態機中的事件?

回答

1

就作出這樣的數據結構:

state1 -> event1, event2 
state2 -> event1 
state3 -> event2, event3 

順便問一下,你所概述什麼看起來不像狀態機。在狀態機,下一個狀態依賴於前一個,所以它看起來像:

[state1, condition1] -> state2 
[state1, condition2] -> state3 
... 

(條件是你的謂詞集)。您還必須以某種方式確保轉換是唯一的,即條件1和條件2不能同時滿足。或者採取第一個是真的。

0

如果您可以從所有可能的狀態進行特定操作,請按照您在數學中所做的那樣操作:將它分解!

即:4 * 10 + 5×10 + 6 * 10 + 4 * 20 + 5 * 20 + 6 * 20 =(4 + 5 + 6)*(10 + 20)

即:你的(遺忘)npc可以在睡覺,工作或吃飯。在所有三種情況下,它必須對某些事件做出反應(被談論,受到攻擊......)。建立兩個FSM:每日活動= [睡覺,工作,吃飯]。反應狀態:{不受干擾,說話,攻擊,...}。然後只將事件轉發給第二個FSM

只要您將獨立事物分解,您就可以繼續保留FSM因式分解。例如,npc(開心,中立,憤怒......)的情緒與日常活動及其反應狀態無關。我的意思是「獨立」,意思是「全國人民代表大會可以在工作中,談到和生氣,而且沒有矛盾」。當然,FSM相互影響,被攻擊的NPC往往會生氣。

所以,你可以添加第三個FSM的情緒狀態,而不是將其摻入在每一個節點

1

嘗試使用模式稱爲「國家」 - http://en.wikipedia.org/wiki/State_pattern

定義抽象超類(如類AbsatractState,把那裏的方法代碼,通用於所有州),各階級能夠代表真實狀態,必須從它的子類。

0

使用分層狀態機(HSM)。 HSM的設計正是爲了將常見的行爲分解爲超範圍,並使其可以重用於所有子狀態。要了解有關HSM的更多信息,可以從Wikipedia文章「UML狀態機」開始,網址爲http://en.wikipedia.org/wiki/UML_state_machine