青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 3,  comments - 0,  trackbacks - 0

以下摘自【設計模式精解(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_
12namespace 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命名空間
13using namespace ripple;
14//初始化靜態指針
15CStateManager* CStateManager::ms_Singleton = NULL;
16//返回單鍵引用,必須返回引用,否則,會在返回時復制一次對象,將導致出錯
17CStateManager& CStateManager::getSingleton()
18{
19    if (NULL == CStateManager::ms_Singleton)
20    {
21        new CStateManager();
22    }

23    return *CStateManager::ms_Singleton;
24}

25//返回單鍵指針
26CStateManager* CStateManager::getSingletonPtr()
27{
28    if (NULL == CStateManager::ms_Singleton)
29    {
30        new CStateManager();
31    }

32    return CStateManager::ms_Singleton;
33}

34//構造函數
35CStateManager::CStateManager()
36{
37    this->mp_TopState = NULL;
38    CStateManager::ms_Singleton = this;
39}

40//析構函數
41CStateManager::~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//插入一個狀態
56void 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//彈出一個狀態
67BOOL 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//執行棧頂狀態的更新函數
84BOOL 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"
13using namespace std;
14using namespace ripple;
15//分別定義三個函數,在具體實現時,可以是個狀態對象之類的。
16//每個函數中都會將自己彈出,已使得其他函數有機會執行
17void fun1()
18{
19    cout<<"call fun1"<<endl;
20    CStateManager::getSingleton().Pop();
21}

22void fun2()
23{
24    cout<<"call fun2"<<endl;
25    CStateManager::getSingleton().Pop();
26}

27
28void fun3()
29{
30    cout<<"call fun3"<<endl;
31    CStateManager::getSingleton().Pop();
32}

33
34
35int 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}

運行結果:
1call fun3
2call fun2
3call fun1
4請按任意鍵繼續. .

這只是個模型,大家可以在此基礎上,編寫更多更靈活的代碼。

版權所有,轉載請注明出處!
如果對本文有不解之處,可以聯系本人(yeduwu@163.com)。或在此博客留言。
有不同見解者,亦可以通過上述通道聯系本人。。歡迎指教。
posted on 2009-10-03 14:07 賴建全 閱讀(247) 評論(0)  編輯 收藏 引用 所屬分類: 【游戲框架基礎】
<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

本博客所有文章,均為本人所著!版權所有,轉載請注明出處! 如果對本文有不解之處,可以聯系本人(yeduwu@163.com)。或在此博客留言。 有不同見解者,亦可以通過上述通道聯系本人。。歡迎指教。

留言簿

隨筆檔案(3)

文章分類(2)

文章檔案(2)

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 3050
  • 排名 - 1842

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品网站在线播放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 | 最新热久久免费视频| 亚洲天堂偷拍| 亚洲欧美自拍偷拍| 久久精品在线观看| 亚洲精品一区二区三区四区高清| 欧美专区福利在线|