基於狀態機的遊戲框架

2021-06-26 18:40:50 字數 1633 閱讀 8317

有限狀態機就是乙個具有有限數量狀態,

並且能夠根據相應的操作從乙個狀態變換到另乙個狀態,

而在同一時刻只能處在一種狀態下的智慧型體。

英文:finite state machine

簡稱:fsm

最簡單的狀態機:if-else

實際上if-else就是乙個最有兩種狀態的狀態機,分別是true和false

當兩種情況不能滿足我們的需求時,我們可以用if-else if -...-else,

不過,為了方便,我們可以使用switch-case代替

首先,定義一組不同的狀態,我們可以使用巨集定義或者列舉:

enum estate;

定義乙個物件,儲存當前的狀態:

estate curstate = estate_min;

現在,就可以在switch中檢測當前的狀態,並做出相應的處理

void update()

}

然後對每種狀態做不同的處理,

void onstateone()

void onstatetwo()

...

例如,對於乙個野怪,狀態一時,可以讓它來回走動,並檢測是否有英雄單位靠近,

當檢測到有英雄靠近時,轉換為狀態二,攻擊英雄。

所有,我們還需要乙個轉換狀態的函式

void convertostate(estate dststate)

上面的狀態機是基於c語言的實現方式,當出現乙個新的狀態時,需要修改相應的**,

這種遊戲框架結構,使用與一般的小遊戲。當遊戲規模較大,邏輯很複雜後,在switch結構就會變得很複雜。

下面是一種用利用物件導向的多型性實現的一種狀態機。

首先,我們需要定義乙個狀態的基類,並定義乙個純虛函式。

這個純虛函式用來處理當前狀態的一些邏輯。

class basestate

};

然後,我們定義乙個狀態機類,來控制狀態的轉換

class fsm

void update()

protected:

basestate* m_curstate;

};

這樣的話我們如果需要新增乙個新的狀態,只需要新加乙個類,繼承自basestate就可以了。

例如:定義乙個monster

class monster

protected:

fsm* m_sfm;

};

再定義兩個狀態類,在其中執行當前狀態的函式,並檢測狀態是否發生變化,

如果狀態變化了,則切換到其他狀態。

class statemove:basestate

void execute()

};class statefight:basestate

void execute()

};

這樣,乙個基於狀態機的遊戲框架就ok了。

基於狀態機的遊戲框架

有限狀態機就是乙個具有有限數量狀態,而且可以依據對應的操作從乙個狀態變換到還有乙個狀態。而在同一時刻僅僅能處在一種狀態下的智慧型體。英文 finite state machine 簡稱 fsm 最簡單的狀態機 if else 實際上if else就是乙個最有兩種狀態的狀態機。各自是true和fals...

QT狀態機框架

qt的state machine framework是在qt4.6中引入的,其理論基礎是harel的statechart,通過定義一系列的可能狀態,以及系統如何在這些狀態中進行轉換 transitions between states 來描述整個狀態機的執行。qt的狀態機體系主要包括三部分模組 光有...

狀態機 狀態機0

近半年都忙於做專案,沒有太多的時間去整理和總結在專案中用過的技術 個人還是覺得技術需要總結提煉和沉澱的,忙到沒時間去總結提公升其實不 是什麼好事,這次講下狀態機,在戰鬥型別的遊戲中角色有多種不同的狀態,而狀態的切換錯綜複雜,23種設計模式中有一種模式叫做狀態模式,不過 這種模式是把狀態切換條件放到各...