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

                    最近在看老大的寫的框架,覺得他有很多地方值我學習.尤其是他的那個消息機制,做得非常妙.
                    以前在做角色漫游那個模塊時,注意到在那個模塊的那個模塊的manager的init中調用setRunning(this , priority) ,就可以把這個整個模塊掛載到游戲循環(huán)中運行,調用setMessage(this , XX_MSG) ,就可以接受其他的游戲模塊傳過來的消息.這個消息可以是系統(tǒng)消息,服務器消息,還有自定義消息.一直都很好奇他是如何實現(xiàn)的.直到看了他的整個代碼,才恍然大悟.
                   昨天晚上,根據自己的理解也寫了一個簡單的例子,用來模擬不同模塊消息通信.代碼如下:

             1/********************************************************************
             2    created:    2008/12/28
             3    created:    28:12:2008   13:51
             4    filename:     e:\MyProject\vs2005\MessageTransfer\MessageTransfer\Env.h
             5    file path:    e:\MyProject\vs2005\MessageTransfer\MessageTransfer
             6    file base:    Env
             7    file ext:    h
             8    author:        coast
             9    
            10    purpose:    環(huán)境類,用來管理所有的實體和負責消息的轉發(fā)
            11*********************************************************************/

            12#ifndef _ENV_H_
            13#define _ENV_H_
            14#include <map>
            15#include <vector>
            16#include <list>
            17#include "Entity.h"
            18#include "Msg.h"
            19using namespace MSG;
            20
            21enum Run_PRI
            22{
            23    //running 函數調用的優(yōu)先級
            24    PRI_1 ,
            25    PRI_2 ,
            26}
            ;
            27
            28
            29class Env
            30{
            31    //單件
            32public :
            33    ~Env() 
            34    {
            35        ENT_LIST::iterator it ;
            36        for (it = m_entRun.begin() ; it != m_entRun.end() ;)
            37        {
            38            if (*it != NULL)
            39            {
            40                 it = m_entRun.erase(it) ; 
            41                 delete *it ;
            42            }

            43            else
            44            {
            45                 ++it ;
            46            }

            47            
            48        }

            49
            50        for (int i = 0 ;i < MAX_MSG ; ++i)
            51        {
            52            m_entMsg[i].erase(m_entMsg[i].begin() , m_entMsg[i].end()) ;
            53        }

            54
            55        if(m_sEnv != NULL)
            56        {
            57            delete m_sEnv ;
            58        }

            59    }
            ;
            60    static Env *getSingletonPtr()
            61    {
            62        if (m_sEnv == NULL)
            63        {
            64            m_sEnv = new Env() ;
            65        }

            66        return m_sEnv ;
            67    }

            68
            69    void rigesterMessage(unsigned int msgId , Entity *ent) ;
            70
            71    void procMessage() ;
            72
            73    void rigesterRunning(unsigned int priority , Entity *ent) ;
            74
            75    void procRunning() ;
            76
            77    void sendMessage(unsigned int msgId ,void *pData) ;
            78private:
            79    //防止使用默認構造函數
            80    Env() 
            81    {
            82        //memset(ent_Msg ,0 ,sizeof(ENT_VEC) * MAX_MSG) ;
            83    }
            ;
            84private:
            85    struct Ent_PRI
            86    {
            87        unsigned int priority  ;
            88        Entity *ent ;
            89    }
            ;
            90    static Env *m_sEnv ;
            91    typedef std::vector<Entity *>  ENT_VEC;
            92    ENT_VEC m_entMsg[MSG::MAX_MSG] ;
            93    typedef std::list<Ent_PRI *> ENT_LIST ;
            94    ENT_LIST m_entRun ;
            95}
            ;
            96#endif
            /********************************************************************
            created:    2008/12/28
            created:    28:12:2008   14:09
            filename:     e:\MyProject\vs2005\MessageTransfer\MessageTransfer\Entity.h
            file path:    e:\MyProject\vs2005\MessageTransfer\MessageTransfer
            file base:    Entity
            file ext:    h
            author:        coast

            purpose:    實體接口,一個模塊就是一個實體.
            ********************************************************************
            */


            #ifndef _ENTITY_H_
            #define _ENTITY_H_
            class Entity
            {
            public:

                
            virtual void init () = 0;

                
            virtual void runing() = 0 ;

                
            virtual void message(unsigned int msgId , void *pData) = 0 ;

            }
            ;

            #endif
            /********************************************************************
                created:    2008/12/28
                created:    28:12:2008   14:15
                filename:     e:\MyProject\vs2005\MessageTransfer\MessageTransfer\Ent.h
                file path:    e:\MyProject\vs2005\MessageTransfer\MessageTransfer
                file base:    Ent
                file ext:    h
                author:        coast
                
                purpose:    定義幾個實體
            ********************************************************************
            */


            #ifndef _ENT_H_
            #define _ENT_H_

            #include 
            "Entity.h"

            class Ent1 : public Entity
            {
            public :
                
            void init() ;
                
            void runing() ;
                
            void message(unsigned int msgId , void *pData) ;
            private:
                
            //member variable 
            }
            ;

            class Ent2 : public Entity
            {
            public :
                
            void init() ;
                
            void runing() ;
                
            void message(unsigned int msgId , void *pData) ;
            private:
                
            //member variable 
            }
            ;

            class Ent3 : public Entity
            {
            public :
                
            void init() ;
                
            void runing() ;
                
            void message(unsigned int msgId , void *pData) ;
            private:
                
            //member variable 
            }
            ;

            #endif
            /********************************************************************
                created:    2008/12/28
                created:    28:12:2008   14:20
                filename:     e:\MyProject\vs2005\MessageTransfer\MessageTransfer\Msg.h
                file path:    e:\MyProject\vs2005\MessageTransfer\MessageTransfer
                file base:    Msg
                file ext:    h
                author:        coast
                
                purpose:    定義消息和消息數據
            ********************************************************************
            */

            #ifndef _MSG_H_
            #define _MSG_H_
            #include 
            <string>
            using namespace  std;
            namespace MSG
            {
                
            enum MSG_ID
                
            {
                    ID_MSG_1 
            = 0 ,
                    ID_MSG_2  ,
                    ID_MSG_3  ,
                    MAX_MSG ,
                }
            ;

                
            struct MSG_0 
                
            {
                    
            string strSender ;//sender name
                }
            ;

                
            const unsigned int MSG_1 = ID_MSG_1 ;
                
            struct MSG_1_Data :public MSG_0
                
            {
                    
            //data
                }
            ;


                
            const unsigned int MSG_2 = ID_MSG_2 ;
                
            struct MSG_2_Data :public MSG_0
                
            {
                    
            //data
                }
            ;

                
            const unsigned int MSG_3 = ID_MSG_3 ;
                
            struct MSG_3_Data :public MSG_0
                
            {
                    
            //data
                }
            ;

            }
             
            #endif
            /********************************************************************
                created:    2008/12/28
                created:    28:12:2008   14:34
                filename:     e:\MyProject\vs2005\MessageTransfer\MessageTransfer\Env.cpp
                file path:    e:\MyProject\vs2005\MessageTransfer\MessageTransfer
                file base:    Env
                file ext:    cpp
                author:        coast
                
                purpose:    
            ********************************************************************
            */

            #include 
            "Env.h"
            #include 
            <iostream>
            using namespace std ;
            Env 
            *Env::m_sEnv = NULL ;

            void Env::procMessage()
            {
                
            /*for (int i = 0 ; i < MAX_MSG ; ++i)
                {

                }
            */

            }


            void Env::sendMessage(unsigned int msgId, void *pData)
            {
                
            if (m_entMsg[msgId].empty())
                
            {
                    cout
            <<"error"<<endl ;
                }

                
            else
                
            {
                    ENT_VEC::iterator it ;  
                    
            for (it = m_entMsg[msgId].begin() ; it != m_entMsg[msgId].end() ; ++it)
                    
            {
                        (
            *it)->message(msgId ,pData) ;
                    }

                }

            }


            void Env::rigesterMessage(unsigned int msgId , Entity *ent)
            {
                ENT_VEC::iterator it ;  
                
            for (it = m_entMsg[msgId].begin() ; it != m_entMsg[msgId].end() ; ++it)
                
            {
                    
            if ((*it) == ent)
                    
            {
                        
            return ;
                    }

                }


                m_entMsg[msgId].push_back(ent) ;
            }


            void Env::rigesterRunning(unsigned int priority, Entity *ent)
            {
                Ent_PRI 
            *pEntPRI = new Ent_PRI();
                pEntPRI
            ->ent = ent ;
                pEntPRI
            ->priority = priority ;
                
            if (m_entRun.empty())
                
            {
                    m_entRun.push_back(pEntPRI) ;
                }

                
            else
                
            {
                    ENT_LIST::iterator it ;
                    
            for (it = m_entRun.begin() ; it != m_entRun.end() ; ++it)
                    
            {
                        
            if ( priority > (*it)->priority)
                        
            {
                            m_entRun.insert(it,pEntPRI) ;
                            
            return ;
                        }

                    }

                    m_entRun.push_back(pEntPRI) ;
                }

            }


            void Env::procRunning()
            {
                ENT_LIST::iterator it ;
                
            for (it = m_entRun.begin() ; it != m_entRun.end() ; ++it)
                
            {
                    (
            *it)->ent->runing() ;
                }

            }
            /********************************************************************
                created:    2008/12/28
                created:    28:12:2008   14:32
                filename:     e:\MyProject\vs2005\MessageTransfer\MessageTransfer\Ent.cpp
                file path:    e:\MyProject\vs2005\MessageTransfer\MessageTransfer
                file base:    Ent
                file ext:    cpp
                author:        coast
                
                purpose:    
            ********************************************************************
            */


            #include 
            "Ent.h"
            #include 
            "Env.h"
            #include 
            <iostream>
            #include 
            <assert.h>
            using namespace std;
            using namespace MSG ;

            void Ent1::init()
            {
                
            //注冊消息,表明ent1有接收MSG1和MSG2的權限
                Env::getSingletonPtr()->rigesterMessage(MSG_1 , this ) ;
                Env::getSingletonPtr()
            ->rigesterMessage(MSG_2 , this ) ;

                
            //注冊running函數,表明ent1有執(zhí)行running函數的權限,優(yōu)先級為2
                Env::getSingletonPtr()->rigesterRunning(PRI_2 ,this ) ; //
            }


            void Ent1::message(unsigned int msgId, void *pData)
            {
                assert(pData) ;

                
            //接收消息,并作相應的處理
                switch (msgId)
                
            {
                
            case MSG_1 :
                    
            {
                        MSG_1_Data 
            *pD1 = (MSG_1_Data *) pData ;
                        cout
            <<"Ent1 received message MSG_1 , " ;
                        cout
            <<"this message from "<<pD1->strSender<<endl ;
                        
            break ;
                    }

                
            case MSG_2 :
                    
            {
                        MSG_2_Data 
            *pD2 = (MSG_2_Data *) pData ;
                        cout
            <<"Ent1 received message MSG_2 ," ;
                        cout
            <<"this message from "<<pD2->strSender<<endl ;
                        
            break ;
                    }

                }

            }


            void Ent1::runing()
            {
                
            int n ;
                cout
            <<"it's turned ent1 :"<<endl ;
                cin 
            >> n ;
                
            if (n == 3)
                
            {
                    MSG_3_Data data ;
                    data.strSender 
            = "ent1" ;
                    Env::getSingletonPtr()
            ->sendMessage(MSG_3 ,(void *)&data) ;//發(fā)送消息MSG_3.
                }

            }



            void Ent2::init()
            {
                
            //注冊running函數,表明ent2有執(zhí)行running函數的權限,優(yōu)先級為1
                Env::getSingletonPtr()->rigesterRunning(PRI_1 ,this) ;
                
            //注冊消息,表明ent2有接收MSG3的權限
                Env::getSingletonPtr()->rigesterMessage(MSG_3 ,this) ;
            }


            void Ent2::message(unsigned int msgId, void *pData)
            {
                assert(pData) ;
                
            //接收消息,并作相應的處理
                switch (msgId)
                
            {
                
            case MSG_3 :
                    MSG_3_Data 
            *pD = (MSG_3_Data *) pData ;
                    cout
            <<"Ent2 received message MSG_3 , " ;
                    cout
            <<"this message from "<<pD->strSender<<endl ;
                    
            break ;
                }

            }


            void Ent2::runing()
            {
                
            int n ;
                cout
            <<"it's turned ent2 :"<<endl ;
                cin 
            >> n ;
                
            if (n == 1)
                
            {
                    MSG_1_Data data ;
                    data.strSender 
            = "ent2" ;
                    Env::getSingletonPtr()
            ->sendMessage(MSG_1 ,(void *)&data) ;//發(fā)送消息MSG_1.
                }

                
            else if (n == 2)
                
            {
                    MSG_2_Data data ;
                    data.strSender 
            = "ent2" ;
                    Env::getSingletonPtr()
            ->sendMessage(MSG_2, (void *)&data) ;//發(fā)送消息MSG2.
                }

                
            else if (n == 3)
                
            {
                    
            //ent2可以接收MSG_3,向自己發(fā)送消息沒意義
                }

            }



            void Ent3::init()
            {
                
            //注冊消息,表明ent3有接收MSG_1,MSG_2,MSG3的權限
                Env::getSingletonPtr()->rigesterMessage(MSG_1 ,this) ;
                
            //Env::getSingletonPtr()->rigesterMessage(MSG_3 ,this) ;//取消ent3接收MSG的權限
                Env::getSingletonPtr()->rigesterMessage(MSG_2 ,this) ;
            }


            void Ent3::message(unsigned int msgId, void *pData)
            {
                
            //接收消息,并作相應的處理
                switch (msgId)
                
            {
                
            case MSG_1 :
                    
            {
                        MSG_1_Data 
            *pD1 = (MSG_1_Data *) pData ;
                        cout
            <<"Ent3 received message MSG_1 , " ;
                        cout
            <<"this message from "<<pD1->strSender<<endl ;
                        
            break ;
                    }

                
            case MSG_2 :
                    
            {
                        MSG_2_Data 
            *pD2 = (MSG_2_Data *) pData ;
                        cout
            <<"Ent3 received message MSG_2 ," ;
                        cout
            <<"this message from "<<pD2->strSender<<endl ;
                        
            break ;
                    }

                
            case MSG_3 :
                    
            {
                        MSG_3_Data 
            *pD3 = (MSG_3_Data *) pData ;
                        cout
            <<"Ent3 received message MSG_3 , " ;
                        cout
            <<"this message from "<<pD3->strSender<<endl ;
                        
            break ;
                    }

                }

            }


            void Ent3::runing()
            {
                
            //ent3 沒有注冊running函數,所以running函數不會運行.
                cout<<"it's turned ent3 ?"<<endl;
            }
            /********************************************************************
                created:    2008/12/30
                created:    30:12:2008   22:49
                filename:     e:\MyProject\vs2005\MessageTransfer\MessageTransfer\test.cpp
                file path:    e:\MyProject\vs2005\MessageTransfer\MessageTransfer
                file base:    test
                file ext:    cpp
                author:        coast
                
                purpose:    
            ********************************************************************
            */

            #include 
            "Env.h"
            #include 
            "Ent.h"
            #include 
            <iostream>
            using namespace std;


            int main()
            {
                Ent1 
            *ent1 = new Ent1() ;
                ent1
            ->init() ;
                Ent2 
            *ent2 = new Ent2() ;
                ent2
            ->init() ;
                Ent3 
            *ent3 = new Ent3() ;
                ent3
            ->init() ;

                
            bool done = true ;
                
            int c ;
                
            while(done)
                
            {
                    Env::getSingletonPtr()
            ->procRunning() ;
                    cout
            <<"quit?"<<endl;
                    cin
            >>c ;
                    
            if ( c == 0)
                    
            {
                        done 
            = false  ;
                    }

                }


                delete ent1 ;
                delete ent2 ;
                delete ent3 ;
                
            return 0 ;
            }
            posted on 2008-12-30 22:55 隙中駒 閱讀(415) 評論(0)  編輯 收藏 引用

            <2008年12月>
            30123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910

            常用鏈接

            留言簿(2)

            隨筆檔案(4)

            文章分類(1)

            文章檔案(1)

            友情鏈接

            最新隨筆

            搜索

            •  

            最新評論

            • 1.?re: DLL學習筆記 3
            • 圖片的路徑是“e:/1.bmp”,你本地應該可以顯示,但是其他地方都看不到圖了。
              請修改圖片鏈接。
            • --guest
            • 2.?re: DLL學習筆記2
            • 圖片的路徑是“e:/1.bmp”,你本地應該可以顯示,但是其他地方都看不到圖了。
              請修改下圖片鏈接。
            • --guest
            • 3.?re: DLL學習筆記1
            • 好,我跟著你一起學習
            • --bk

            閱讀排行榜

            評論排行榜

            久久精品国产精品亚洲精品| 中文国产成人精品久久不卡| 久久久精品人妻一区二区三区蜜桃| 久久久久久无码国产精品中文字幕| 高清免费久久午夜精品| 人妻少妇久久中文字幕| 奇米影视7777久久精品| 7777久久久国产精品消防器材| 国内精品久久久久影院老司| 麻豆久久| 久久福利资源国产精品999| 性高湖久久久久久久久AAAAA| 亚洲国产成人精品女人久久久| 婷婷久久综合九色综合绿巨人| 性高湖久久久久久久久AAAAA| 亚洲一级Av无码毛片久久精品| 伊人久久大香线蕉综合5g| 亚洲色欲久久久久综合网| 久久强奷乱码老熟女网站| 狠狠色婷婷久久综合频道日韩 | 伊人色综合九久久天天蜜桃| 久久九九久精品国产| 久久久久一级精品亚洲国产成人综合AV区 | 2021国产成人精品久久| 99久久精品国产综合一区| 久久人人爽人人爽人人片AV东京热| 久久夜色精品国产www| 久久人人爽人人爽人人片av麻烦 | 91精品国产色综久久| 久久精品国产亚洲Aⅴ香蕉| 亚洲一级Av无码毛片久久精品| 国产偷久久久精品专区| 国产精品久久久久久一区二区三区| 国产综合精品久久亚洲| 狠狠色丁香久久婷婷综合_中 | 国产精品成人无码久久久久久 | A级毛片无码久久精品免费| 老色鬼久久亚洲AV综合| 国产免费久久精品99久久| 日本五月天婷久久网站| 久久精品国产99国产精偷 |