• <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>
            posts - 3,  comments - 0,  trackbacks - 0

            以下摘自【設(shè)計模式精解(GoF 23種設(shè)計解析附C++實現(xiàn)源碼)】中關(guān)于狀態(tài)機模式的介紹

                  有限狀態(tài)自動機(FSM)也是一個典型的狀態(tài)不同,對輸入有不同的響應(yīng)(狀態(tài)轉(zhuǎn)移)。通常我們在實現(xiàn)這類系統(tǒng)會使用到很多的Switch/Case語句,Case某種狀態(tài),發(fā)生什么動作,Case另外一種狀態(tài),則發(fā)生另外一種狀態(tài)。但是這種實現(xiàn)方式至少有以下兩個問題:
                  1)當(dāng)狀態(tài)數(shù)目不是很多的時候,Switch/Case可能可以搞定。但是當(dāng)狀態(tài)數(shù)目很多的時候(實際系統(tǒng)中也正是如此),維護(hù)一大組的Switch/Case語句將是一件異常困難并且容易出錯的事情。
                  2)狀態(tài)邏輯和動作實現(xiàn)沒有分離。在很多的系統(tǒng)實現(xiàn)中,動作的實現(xiàn)代碼直接寫在狀態(tài)的邏輯當(dāng)中。這帶來的后果就是系統(tǒng)的擴展性和維護(hù)得不到保證。
            State模式就是被用來解決上面列出的兩個問題的,在State模式中我們將狀態(tài)邏輯和動作實現(xiàn)進(jìn)行分離。當(dāng)一個操作中要維護(hù)大量的case分支語句,并且這些分支依賴于對象的狀態(tài)。State模式將每一個分支都封裝到獨立的類中。

            在這里【設(shè)計模式精解(GoF 23種設(shè)計解析附C++實現(xiàn)源碼)】中的代碼那樣,我只是解釋一個模型,實現(xiàn)一個模型,用棧來管理游戲狀態(tài)。你可以稱呼它為游戲狀態(tài)管理棧等。
            說明:
            由于考慮到游戲中的狀態(tài)管理一般只有一個,故這里采用單鍵模式模型。
            由于考慮到會增加復(fù)雜度,這里不考慮模板(按道理應(yīng)該采用模板,以增加代碼可重用性,當(dāng)然,用了模板就不再是純單鍵模式了)

            好了,老樣子,上代碼

            先看看定義代碼
            頭文件STATEMANAGER.H
             1//********************************************************************
             2//    STATEMANAGER.H    文件注釋
             3//    文件名  :    STATEMANAGER.H
             4//    文件路徑:    J:\CODING\游戲引擎\STATEMANAGER\
             5//    作者    :    RIPPLE
             6//    創(chuàng)建時間:    2009/10/3 13:44
             7//    文件描述:    游戲狀態(tài)管理棧類聲明
             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    //    創(chuàng)建時間:    2009/10/3 13:45
            21    //    類描述  :    游戲狀態(tài)管理類。一般游戲只會有一個狀態(tài)管理,故采用單鍵模式管理
            22    //*********************************************************************
            23
            24    class CStateManager
            25    {
            26    public:    
            27        static CStateManager& getSingleton();        //返回引用,這步至關(guān)重要。
            28        static CStateManager* getSingletonPtr();    //返回單鍵指針
            29        
            30        virtual ~CStateManager();
            31
            32        //定義狀態(tài)調(diào)用函數(shù)指針類型
            33        typedef void (*StateCallFunc)();
            34
            35        //定義狀態(tài)結(jié)構(gòu)
            36        typedef struct tagState
            37        {    
            38            tagState()                
            39            {
            40                this->Update = NULL;
            41                this->Next = NULL;
            42            }

            43            StateCallFunc Update;    //各個狀態(tài)調(diào)用的函數(shù)指針
            44            tagState* Next;            //下個函數(shù)狀態(tài)的地址(如果有的話)
            45        }
            STATE;
            46
            47        void Push(StateCallFunc func);    //插入一個狀態(tài)
            48        BOOL Pop();                        //彈出一個狀態(tài)
            49        BOOL Process();                    //執(zhí)行棧頂狀態(tài)的更新函數(shù)
            50
            51    private:
            52        CStateManager();
            53        STATE* mp_TopState;
            54        static CStateManager* ms_Singleton; 
            55    }
            ;
            56
            57}

            58#endif

            對應(yīng)的實現(xiàn),源文件STATEMANAGER.CPP
             1//********************************************************************
             2//    STATEMANAGER.CPP    文件注釋
             3//    文件名  :    STATEMANAGER.CPP
             4//    文件路徑:    J:\CODING\游戲引擎\STATEMANAGER\
             5//    作者    :    RIPPLE
             6//    創(chuàng)建時間:    2009/10/3 13:47
             7//    文件描述:    CSteteManager游戲狀態(tài)管理類實現(xiàn)
             8//*********************************************************************
             9
            10#include <windows.h>
            11#include "StateManager.h"
            12//引用ripple命名空間
            13using namespace ripple;
            14//初始化靜態(tài)指針
            15CStateManager* CStateManager::ms_Singleton = NULL;
            16//返回單鍵引用,必須返回引用,否則,會在返回時復(fù)制一次對象,將導(dǎo)致出錯
            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//構(gòu)造函數(shù)
            35CStateManager::CStateManager()
            36{
            37    this->mp_TopState = NULL;
            38    CStateManager::ms_Singleton = this;
            39}

            40//析構(gòu)函數(shù)
            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//插入一個狀態(tài)
            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//彈出一個狀態(tài)
            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//執(zhí)行棧頂狀態(tài)的更新函數(shù)
            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//    創(chuàng)建時間:    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//分別定義三個函數(shù),在具體實現(xiàn)時,可以是個狀態(tài)對象之類的。
            16//每個函數(shù)中都會將自己彈出,已使得其他函數(shù)有機會執(zhí)行
            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    //將三個函數(shù)壓入棧內(nèi)
            38    //使用指針
            39    CStateManager::getSingletonPtr()->Push(fun1);
            40    //使用引用
            41    CStateManager::getSingleton().Push(fun2);
            42    //使用指針
            43    CStateManager::getSingletonPtr()->Push(fun3);
            44    //循環(huán)調(diào)用,當(dāng)棧空是返回FALSE
            45    while (FALSE != CStateManager::getSingleton().Process())
            46    {
            47    }

            48    return 0;
            49}

            運行結(jié)果:
            1call fun3
            2call fun2
            3call fun1
            4請按任意鍵繼續(xù). .

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

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

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            <2025年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

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

            留言簿

            隨筆檔案(3)

            文章分類(2)

            文章檔案(2)

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 3009
            • 排名 - 1838

            最新評論

            閱讀排行榜

            評論排行榜

            青青草原综合久久| 好久久免费视频高清| 久久综合丁香激情久久| 婷婷久久久亚洲欧洲日产国码AV | 2021国产成人精品久久| 少妇高潮惨叫久久久久久| 狠狠色丁香久久婷婷综合图片| 精品久久久久国产免费| 亚洲欧美精品伊人久久| 久久青草国产精品一区| 国产亚洲精品美女久久久| 久久精品黄AA片一区二区三区| 婷婷五月深深久久精品| 久久久久久亚洲精品成人| 日本久久久久亚洲中字幕| 久久精品无码专区免费青青| 精品久久久久久国产潘金莲 | 99久久中文字幕| 国内精品人妻无码久久久影院 | 狠狠精品干练久久久无码中文字幕 | 久久精品国产乱子伦| 国内精品人妻无码久久久影院导航| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 伊人久久大香线蕉影院95| 99久久精品国产综合一区| 国产精品一区二区久久精品无码 | 亚洲国产精品成人久久蜜臀| 亚洲&#228;v永久无码精品天堂久久| 亚洲Av无码国产情品久久| 影音先锋女人AV鲁色资源网久久 | 久久电影网一区| 久久夜色撩人精品国产小说| 久久精品桃花综合| 国产高清美女一级a毛片久久w| 精品人妻久久久久久888| 狠狠干狠狠久久| 久久久久亚洲AV综合波多野结衣| 狠狠色丁香久久婷婷综合_中| 国产成人无码久久久精品一| 国产免费福利体检区久久 | 久久亚洲电影|