青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
Starting。。。
Step By Step 。。。
C++博客
首頁
新隨筆
聯系
聚合
管理
posts - 3, comments - 0, trackbacks - 0
【個人YY--游戲中狀態切換的實現模型】
以下摘自【設計模式精解(GoF 23種設計解析附C++實現源碼)】中關于狀態機模式的介紹
有限狀態自動機(FSM)也是一個典型的狀態不同,對輸入有不同的響應(狀態轉移)。通常我們在實現這類系統會使用到很多的Switch/Case語句,Case某種狀態,發生什么動作,Case另外一種狀態,則發生另外一種狀態。但是這種實現方式至少有以下兩個問題:
1)當狀態數目不是很多的時候,Switch/Case可能可以搞定。但是當狀態數目很多的時候(實際系統中也正是如此),維護一大組的Switch/Case語句將是一件異常困難并且容易出錯的事情。
2)狀態邏輯和動作實現沒有分離。在很多的系統實現中,動作的實現代碼直接寫在狀態的邏輯當中。這帶來的后果就是系統的擴展性和維護得不到保證。
State模式就是被用來解決上面列出的兩個問題的,在State模式中我們將狀態邏輯和動作實現進行分離。當一個操作中要維護大量的case分支語句,并且這些分支依賴于對象的狀態。State模式將每一個分支都封裝到獨立的類中。
在這里【設計模式精解(GoF 23種設計解析附C++實現源碼)】中的代碼那樣,我只是解釋一個模型,實現一個模型,用棧來管理游戲狀態。你可以稱呼它為游戲狀態管理棧等。
說明:
由于考慮到游戲中的狀態管理一般只有一個,故這里采用單鍵模式模型。
由于考慮到會增加復雜度,這里不考慮模板(按道理應該采用模板,以增加代碼可重用性,當然,用了模板就不再是純單鍵模式了)
好了,老樣子,上代碼
先看看定義代碼
頭文件STATEMANAGER.H
1
//
********************************************************************
2
//
STATEMANAGER.H 文件注釋
3
//
文件名 : STATEMANAGER.H
4
//
文件路徑: J:\CODING\游戲引擎\STATEMANAGER\
5
//
作者 : RIPPLE
6
//
創建時間: 2009/10/3 13:44
7
//
文件描述: 游戲狀態管理棧類聲明
8
//
*********************************************************************
9
10
#ifndef _H_STATEMANGER_H_
11
#define
_H_STATEMANGER_H_
12
namespace
ripple
13
{
14
//
********************************************************************
15
//
CStateManager 類注釋
16
//
類名 : CStateManager
17
//
基類名稱: NULL
18
//
命名空間: ripple
19
//
作者 : RIPPLE
20
//
創建時間: 2009/10/3 13:45
21
//
類描述 : 游戲狀態管理類。一般游戲只會有一個狀態管理,故采用單鍵模式管理
22
//
*********************************************************************
23
24
class
CStateManager
25
{
26
public
:
27
static
CStateManager
&
getSingleton();
//
返回引用,這步至關重要。
28
static
CStateManager
*
getSingletonPtr();
//
返回單鍵指針
29
30
virtual
~
CStateManager();
31
32
//
定義狀態調用函數指針類型
33
typedef
void
(
*
StateCallFunc)();
34
35
//
定義狀態結構
36
typedef
struct
tagState
37
{
38
tagState()
39
{
40
this
->
Update
=
NULL;
41
this
->
Next
=
NULL;
42
}
43
StateCallFunc Update;
//
各個狀態調用的函數指針
44
tagState
*
Next;
//
下個函數狀態的地址(如果有的話)
45
}
STATE;
46
47
void
Push(StateCallFunc func);
//
插入一個狀態
48
BOOL Pop();
//
彈出一個狀態
49
BOOL Process();
//
執行棧頂狀態的更新函數
50
51
private
:
52
CStateManager();
53
STATE
*
mp_TopState;
54
static
CStateManager
*
ms_Singleton;
55
}
;
56
57
}
58
#endif
對應的實現,源文件STATEMANAGER.CPP
1
//
********************************************************************
2
//
STATEMANAGER.CPP 文件注釋
3
//
文件名 : STATEMANAGER.CPP
4
//
文件路徑: J:\CODING\游戲引擎\STATEMANAGER\
5
//
作者 : RIPPLE
6
//
創建時間: 2009/10/3 13:47
7
//
文件描述: CSteteManager游戲狀態管理類實現
8
//
*********************************************************************
9
10
#include
<
windows.h
>
11
#include
"
StateManager.h
"
12
//
引用ripple命名空間
13
using
namespace
ripple;
14
//
初始化靜態指針
15
CStateManager
*
CStateManager::ms_Singleton
=
NULL;
16
//
返回單鍵引用,必須返回引用,否則,會在返回時復制一次對象,將導致出錯
17
CStateManager
&
CStateManager::getSingleton()
18
{
19
if
(NULL
==
CStateManager::ms_Singleton)
20
{
21
new
CStateManager();
22
}
23
return
*
CStateManager::ms_Singleton;
24
}
25
//
返回單鍵指針
26
CStateManager
*
CStateManager::getSingletonPtr()
27
{
28
if
(NULL
==
CStateManager::ms_Singleton)
29
{
30
new
CStateManager();
31
}
32
return
CStateManager::ms_Singleton;
33
}
34
//
構造函數
35
CStateManager::CStateManager()
36
{
37
this
->
mp_TopState
=
NULL;
38
CStateManager::ms_Singleton
=
this
;
39
}
40
//
析構函數
41
CStateManager::
~
CStateManager()
42
{
43
STATE
*
tmp;
44
while
((tmp
=
this
->
mp_TopState)
!=
NULL)
45
{
46
this
->
mp_TopState
=
this
->
mp_TopState
->
Next;
47
delete tmp;
48
}
49
if
(NULL
!=
CStateManager::ms_Singleton)
50
{
51
delete CStateManager::ms_Singleton;
52
CStateManager::ms_Singleton
=
NULL;
53
}
54
}
55
//
插入一個狀態
56
void
CStateManager::Push(StateCallFunc func)
57
{
58
if
(NULL
!=
func)
59
{
60
STATE
*
tmp
=
new
STATE;
61
tmp
->
Next
=
this
->
mp_TopState;
62
tmp
->
Update
=
func;
63
this
->
mp_TopState
=
tmp;
64
}
65
}
66
//
彈出一個狀態
67
BOOL CStateManager::Pop()
68
{
69
STATE
*
tmp
=
this
->
mp_TopState;
70
if
(NULL
!=
tmp)
71
{
72
this
->
mp_TopState
=
this
->
mp_TopState
->
Next;
73
delete tmp;
74
}
75
76
if
(NULL
==
this
->
mp_TopState)
77
{
78
return
FALSE;
79
}
80
81
return
TRUE;
82
}
83
//
執行棧頂狀態的更新函數
84
BOOL CStateManager::Process()
85
{
86
if
(NULL
!=
this
->
mp_TopState)
87
{
88
this
->
mp_TopState
->
Update();
89
return
TRUE;
90
}
91
return
FALSE;
92
}
測試代碼 TEST.CPP
1
//
********************************************************************
2
//
TEST.CPP 文件注釋
3
//
文件名 : TEST.CPP
4
//
文件路徑: J:\CODING\游戲引擎\STATEMANAGER\
5
//
作者 : RIPPLE
6
//
創建時間: 2009/10/3 13:59
7
//
文件描述: 測試CStateManager類是否可以正常使用
8
//
*********************************************************************
9
10
#include
<
iostream
>
11
#include
<
Windows.h
>
12
#include
"
StateManager.h
"
13
using
namespace
std;
14
using
namespace
ripple;
15
//
分別定義三個函數,在具體實現時,可以是個狀態對象之類的。
16
//
每個函數中都會將自己彈出,已使得其他函數有機會執行
17
void
fun1()
18
{
19
cout
<<
"
call fun1
"
<<
endl;
20
CStateManager::getSingleton().Pop();
21
}
22
void
fun2()
23
{
24
cout
<<
"
call fun2
"
<<
endl;
25
CStateManager::getSingleton().Pop();
26
}
27
28
void
fun3()
29
{
30
cout
<<
"
call fun3
"
<<
endl;
31
CStateManager::getSingleton().Pop();
32
}
33
34
35
int
main()
36
{
37
//
將三個函數壓入棧內
38
//
使用指針
39
CStateManager::getSingletonPtr()
->
Push(fun1);
40
//
使用引用
41
CStateManager::getSingleton().Push(fun2);
42
//
使用指針
43
CStateManager::getSingletonPtr()
->
Push(fun3);
44
//
循環調用,當棧空是返回FALSE
45
while
(FALSE
!=
CStateManager::getSingleton().Process())
46
{
47
}
48
return
0
;
49
}
運行結果:
1
call fun3
2
call fun2
3
call fun1
4
請按任意鍵繼續. .
這只是個模型,大家可以在此基礎上,編寫更多更靈活的代碼。
版權所有,轉載請注明出處!
如果對本文有不解之處,可以聯系本人(
yeduwu@163.com
)。或在此博客留言。
有不同見解者,亦可以通過上述通道聯系本人。。歡迎指教。
posted on 2009-10-03 14:07
賴建全
閱讀(247)
評論(0)
編輯
收藏
引用
所屬分類:
【游戲框架基礎】
只有注冊用戶
登錄
后才能發表評論。
【推薦】100%開源!大型工業跨平臺軟件C++源碼提供,建模,組態!
網站導航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
Copyright ©2025 賴建全 Powered By:
博客園
模板提供:
滬江博客
<
2025年9月
>
日
一
二
三
四
五
六
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
本博客所有文章,均為本人所著!版權所有,轉載請注明出處! 如果對本文有不解之處,可以聯系本人(yeduwu@163.com)。或在此博客留言。 有不同見解者,亦可以通過上述通道聯系本人。。歡迎指教。
留言簿
給我留言
查看公開留言
查看私人留言
隨筆檔案
(3)
2009年10月 (3)
文章分類
(2)
【C++相關】
【HGE研究】
【OGRE研究】
【軟件工程相關】(1)
【游戲框架基礎】(1)
文章檔案
(2)
2009年10月 (2)
最新隨筆
1.?東南融通無領導小組面試記
2.?【博客聲明】
3.?昨天去大利嘉城買了新的顯卡。
搜索
積分與排名
積分 - 3050
排名 - 1842
最新評論
閱讀排行榜
1.?東南融通無領導小組面試記(1083)
2.?昨天去大利嘉城買了新的顯卡。(208)
3.?【博客聲明】(204)
評論排行榜
1.?昨天去大利嘉城買了新的顯卡。(0)
2.?【博客聲明】(0)
3.?東南融通無領導小組面試記(0)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
亚洲精品网站在线播放gif
|
欧美在线观看一区二区三区
|
欧美成人亚洲成人
|
亚洲国产精选
|
亚洲第一色在线
|
欧美a级片网
|
亚洲精品美女在线
|
夜夜嗨av一区二区三区中文字幕
|
亚洲精品一区二区网址
|
欧美日韩免费观看一区=区三区
|
一本色道久久综合一区
|
亚洲美女诱惑
|
国产亚洲精品一区二区
|
欧美大尺度在线观看
|
欧美成人第一页
|
亚洲一二三区在线
|
欧美一区二区高清在线观看
|
在线看无码的免费网站
|
亚洲精品免费观看
|
国产日韩欧美成人
|
欧美激情久久久
|
国产精品vvv
|
久久综合色播五月
|
欧美极品在线观看
|
午夜亚洲激情
|
久久亚洲精品一区
|
亚洲综合精品自拍
|
久久久久久久一区二区三区
|
一区二区成人精品
|
亚欧成人精品
|
一区二区三区日韩欧美精品
|
欧美亚洲一级
|
亚洲视频999
|
久久视频一区二区
|
午夜精品偷拍
|
欧美激情区在线播放
|
久久国内精品视频
|
欧美久久一区
|
欧美成人免费大片
|
国产日韩欧美不卡在线
|
亚洲九九精品
|
亚洲福利视频一区
|
欧美亚洲一区二区三区
|
夜夜夜精品看看
|
久久视频在线视频
|
欧美在线免费视频
|
欧美天堂在线观看
|
在线观看欧美日韩
|
日韩视频中文
|
久热精品视频在线观看一区
|
欧美一区二区精美
|
欧美三级欧美一级
|
亚洲国产一区二区在线
|
韩国成人精品a∨在线观看
|
a91a精品视频在线观看
|
亚洲人成小说网站色在线
|
欧美专区日韩视频
|
午夜精品福利在线
|
国产精品超碰97尤物18
|
亚洲精品国产精品国自产在线
|
精品白丝av
|
欧美在线影院
|
久久久久综合网
|
国产日韩欧美三区
|
亚洲欧美日韩一区二区三区在线
|
国内精品模特av私拍在线观看
|
一级日韩一区在线观看
|
一本色道久久综合亚洲精品小说
|
亚洲一区二区精品在线观看
|
欧美xxxx在线观看
|
欧美激情一区二区三区
|
在线国产欧美
|
老司机一区二区
|
欧美国产高清
|
亚洲精品一品区二品区三品区
|
快射av在线播放一区
|
欧美电影在线观看
|
亚洲精品影院在线观看
|
欧美激情亚洲国产
|
99ri日韩精品视频
|
亚洲欧美日韩国产综合
|
国产人久久人人人人爽
|
欧美一区二区三区视频免费
|
久久一区二区三区国产精品
|
在线欧美视频
|
欧美国产日韩在线
|
一本久道久久久
|
欧美在线中文字幕
|
在线观看亚洲视频啊啊啊啊
|
欧美 日韩 国产一区二区在线视频
|
欧美一区二区三区视频免费播放
|
久久精品免费看
|
免费在线观看一区二区
|
99re热这里只有精品视频
|
最新精品在线
|
亚洲一区二区三区视频
|
国产欧美一区二区三区视频
|
久久精品男女
|
亚洲精品中文在线
|
欧美在线视频免费播放
|
亚洲国产精品传媒在线观看
|
欧美日韩成人在线
|
性欧美在线看片a免费观看
|
麻豆成人av
|
国产精品一区二区你懂得
|
久久久久久自在自线
|
亚洲美女尤物影院
|
久久综合九色综合久99
|
一区二区三区免费看
|
国产一区二区三区四区hd
|
欧美国产精品一区
|
先锋影院在线亚洲
|
91久久久久久久久久久久久
|
欧美在线视频二区
|
制服丝袜亚洲播放
|
亚洲国产成人精品视频
|
国产精品夜夜夜
|
欧美激情国产日韩
|
欧美中文在线免费
|
一区二区三区日韩欧美精品
|
蜜桃av综合
|
欧美专区在线
|
亚洲一区日韩在线
|
亚洲精品国产系列
|
国内精品久久久久伊人av
|
国产精品www994
|
欧美电影在线观看完整版
|
香蕉免费一区二区三区在线观看
|
亚洲日本欧美
|
欧美激情影音先锋
|
久久免费的精品国产v∧
|
亚洲一本大道在线
|
夜夜嗨av色一区二区不卡
|
一区免费观看视频
|
国产日韩精品一区二区三区在线
|
欧美视频日韩视频在线观看
|
欧美国产乱视频
|
噜噜噜噜噜久久久久久91
|
欧美影视一区
|
欧美一区二区三区在线看
|
亚洲小视频在线
|
宅男噜噜噜66一区二区66
|
亚洲免费电影在线
|
亚洲人成久久
|
亚洲精品美女久久7777777
|
亚洲成人自拍视频
|
蜜桃av综合
|
免费日韩成人
|
欧美激情一区二区三区在线视频观看
|
老司机午夜精品视频
|
久久久99精品免费观看不卡
|
久久久久久久999精品视频
|
久久久精品日韩欧美
|
免费不卡在线观看av
|
欧美激情第1页
|
亚洲激情av
|
亚洲视频二区
|
久久黄色网页
|
农村妇女精品
|
亚洲福利免费
|
一区二区免费在线播放
|
亚洲在线日韩
|
久久夜色精品国产
|
欧美美女bb生活片
|
国产精品免费网站
|
国内伊人久久久久久网站视频
|
亚洲国产成人一区
|
在线亚洲一区二区
|
久久久亚洲欧洲日产国码αv
|
美女网站久久
|
亚洲成人直播
|
亚洲欧洲在线视频
|
日韩视频一区二区三区在线播放免费观看
|
久久久久国产精品厨房
|
宅男66日本亚洲欧美视频
|
久久综合色播五月
|
久久免费精品日本久久中文字幕
|
国产网站欧美日韩免费精品在线观看
|
欧美午夜精品久久久久久人妖
|
欧美精品久久一区
|
免费视频最近日韩
|
亚洲国产精品成人综合
|
亚洲激情午夜
|
亚洲精品日韩在线
|
亚洲欧美日韩国产综合在线
|
女同性一区二区三区人了人一
|
久久先锋资源
|
麻豆国产精品va在线观看不卡
|
亚洲高清中文字幕
|
亚洲精品自在久久
|
亚洲视频一区二区免费在线观看
|
99精品视频免费
|
久久综合色影院
|
亚洲国产精品久久久久婷婷884
|
最新热久久免费视频
|
亚洲天堂偷拍
|
亚洲欧美自拍偷拍
|
久久精品在线观看
|
亚洲精品一区二区三区四区高清
|
欧美专区福利在线
|