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

白駒過隙
學(xué)而不思則罔,思而不學(xué)則怠
posts - 4,  comments - 3,  trackbacks - 0

        最近在看老大的寫的框架,覺得他有很多地方值我學(xué)習(xí).尤其是他的那個(gè)消息機(jī)制,做得非常妙.
        以前在做角色漫游那個(gè)模塊時(shí),注意到在那個(gè)模塊的那個(gè)模塊的manager的init中調(diào)用setRunning(this , priority) ,就可以把這個(gè)整個(gè)模塊掛載到游戲循環(huán)中運(yùn)行,調(diào)用setMessage(this , XX_MSG) ,就可以接受其他的游戲模塊傳過來的消息.這個(gè)消息可以是系統(tǒng)消息,服務(wù)器消息,還有自定義消息.一直都很好奇他是如何實(shí)現(xiàn)的.直到看了他的整個(gè)代碼,才恍然大悟.
       昨天晚上,根據(jù)自己的理解也寫了一個(gè)簡(jiǎ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)境類,用來管理所有的實(shí)體和負(fù)責(zé)消息的轉(zhuǎ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 函數(shù)調(diào)用的優(yōu)先級(jí)
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    //防止使用默認(rèn)構(gòu)造函數(shù)
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:    實(shí)體接口,一個(gè)模塊就是一個(gè)實(shí)體.
********************************************************************
*/


#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:    定義幾個(gè)實(shí)體
********************************************************************
*/


#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:    定義消息和消息數(shù)據(jù)
********************************************************************
*/

#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()
{
    
//注冊(cè)消息,表明ent1有接收MSG1和MSG2的權(quán)限
    Env::getSingletonPtr()->rigesterMessage(MSG_1 , this ) ;
    Env::getSingletonPtr()
->rigesterMessage(MSG_2 , this ) ;

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


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

    
//接收消息,并作相應(yīng)的處理
    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()
{
    
//注冊(cè)running函數(shù),表明ent2有執(zhí)行running函數(shù)的權(quán)限,優(yōu)先級(jí)為1
    Env::getSingletonPtr()->rigesterRunning(PRI_1 ,this) ;
    
//注冊(cè)消息,表明ent2有接收MSG3的權(quán)限
    Env::getSingletonPtr()->rigesterMessage(MSG_3 ,this) ;
}


void Ent2::message(unsigned int msgId, void *pData)
{
    assert(pData) ;
    
//接收消息,并作相應(yīng)的處理
    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()
{
    
//注冊(cè)消息,表明ent3有接收MSG_1,MSG_2,MSG3的權(quán)限
    Env::getSingletonPtr()->rigesterMessage(MSG_1 ,this) ;
    
//Env::getSingletonPtr()->rigesterMessage(MSG_3 ,this) ;//取消ent3接收MSG的權(quán)限
    Env::getSingletonPtr()->rigesterMessage(MSG_2 ,this) ;
}


void Ent3::message(unsigned int msgId, void *pData)
{
    
//接收消息,并作相應(yīng)的處理
    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 沒有注冊(cè)running函數(shù),所以running函數(shù)不會(huì)運(yùn)行.
    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 隙中駒 閱讀(441) 評(píng)論(0)  編輯 收藏 引用

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



<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

常用鏈接

留言簿(2)

隨筆檔案(4)

文章分類(1)

文章檔案(1)

友情鏈接

最新隨筆

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            老司机一区二区| 一区二区免费在线播放| 亚洲欧洲日韩综合二区| 一本久道久久久| 久久激情婷婷| 欧美欧美天天天天操| 国产麻豆日韩欧美久久| 亚洲国产婷婷香蕉久久久久久99| 中文一区在线| 久久婷婷人人澡人人喊人人爽| 亚洲国产天堂网精品网站| 亚洲私拍自拍| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美视频中文在线看| 黑人一区二区| 亚洲尤物在线| 亚洲大片在线观看| 性色av一区二区三区红粉影视| 欧美黄色日本| 黑人巨大精品欧美一区二区| 亚洲一区在线视频| 欧美激情精品久久久久久大尺度 | 亚洲激情啪啪| 欧美一区二区三区视频在线观看| 亚洲承认在线| 久久国产成人| 国产精品欧美久久久久无广告| 亚洲激情国产精品| 久久av一区二区三区| 亚洲精品小视频在线观看| 久久精品视频导航| 国产精品青草久久| 99成人免费视频| 欧美成人一二三| 欧美一区二区三区免费在线看| 欧美日韩影院| 亚洲精品国产精品国自产在线| 久久深夜福利| 先锋资源久久| 国产精品欧美一区喷水| 亚洲婷婷综合色高清在线| 亚洲国产精品欧美一二99| 久久久久久午夜| 国产一区二区在线观看免费| 小黄鸭精品密入口导航| 99视频精品免费观看| 欧美黄污视频| 亚洲人成人一区二区三区| 老司机aⅴ在线精品导航| 欧美一区免费| 国产一区二区三区的电影 | 久久国产天堂福利天堂| 国产欧美视频在线观看| 亚洲免费在线精品一区| 9久re热视频在线精品| 欧美美女bb生活片| 夜色激情一区二区| 亚洲七七久久综合桃花剧情介绍| 老司机成人网| 亚洲国产精品尤物yw在线观看| 久色成人在线| 久久青草福利网站| 在线国产日韩| 欧美成人午夜| 欧美高清视频一二三区| 亚洲精品美女在线观看| 亚洲国产精品小视频| 欧美精品日韩一区| 99在线|亚洲一区二区| 日韩视频中午一区| 国产精品久久一区二区三区| 亚洲一级片在线观看| 一区二区日韩精品| 国产精品一区二区三区免费观看| 亚洲欧美日韩综合aⅴ视频| 亚洲一区亚洲二区| 国产欧美在线视频| 老司机免费视频一区二区| 久久久久欧美精品| 亚洲国产欧美一区二区三区同亚洲| 欧美岛国在线观看| 欧美精品aa| 亚洲男人第一av网站| 欧美一二三区在线观看| 黄色欧美日韩| 91久久在线| 欧美性做爰猛烈叫床潮| 久久福利视频导航| 久久精品亚洲一区二区| 亚洲国产小视频| 夜夜嗨av色综合久久久综合网| 国产精品久久久久一区二区三区| 久久aⅴ国产欧美74aaa| 久热精品视频在线| 一本久久青青| 午夜伦理片一区| 影音先锋成人资源站| 亚洲电影在线播放| 国产精品va在线播放| 久久成人av少妇免费| 美腿丝袜亚洲色图| 亚洲天堂成人| 欧美在现视频| 99精品热6080yy久久 | 久久久人成影片一区二区三区观看| 久久精品久久99精品久久| 亚洲精品小视频在线观看| 亚洲一区成人| 亚洲电影免费观看高清完整版在线 | 国产精品美女久久久久久2018| 久久九九精品99国产精品| 欧美国产日本| 久久精品国产99精品国产亚洲性色 | 国产一区二区三区成人欧美日韩在线观看 | 久久久91精品| 欧美成人综合在线| 欧美一区二区三区久久精品| 久久夜色精品国产欧美乱极品| 一区二区不卡在线视频 午夜欧美不卡'| 亚洲一二三级电影| 亚洲国产精品va在看黑人| 在线亚洲欧美| 亚洲国产成人精品女人久久久 | 亚洲欧美日韩一区二区三区在线| 亚洲激情综合| 午夜精品久久99蜜桃的功能介绍| 亚洲免费观看高清完整版在线观看| 亚洲一二三区在线观看| 亚洲激情在线| 欧美在线免费观看| 亚洲视频在线播放| 美女黄毛**国产精品啪啪| 欧美一级视频免费在线观看| 欧美激情一区二区三区蜜桃视频| 久久精品国产精品亚洲综合| 欧美日韩一级视频| 欧美激情中文不卡| 国产日韩一级二级三级| aa国产精品| 亚洲日本aⅴ片在线观看香蕉| 欧美一区二区三区另类| 亚洲午夜羞羞片| 欧美va天堂| 久久久亚洲国产天美传媒修理工 | 久久九九久久九九| 国产精品不卡在线| 亚洲精品自在在线观看| 亚洲成人在线网| 欧美一区二区三区喷汁尤物| 亚洲图片激情小说| 欧美日本国产| 亚洲高清不卡| 怡红院精品视频| 欧美在线高清| 久久国产福利国产秒拍| 国产精品久久久久aaaa| 亚洲精品久久久久久一区二区| 亚洲福利在线观看| 久久精品国产精品亚洲综合| 欧美亚洲一区| 国产精品无码永久免费888| 日韩亚洲欧美中文三级| 亚洲免费黄色| 免费高清在线一区| 嫩模写真一区二区三区三州| 国产综合久久久久久鬼色| 亚洲在线视频观看| 亚洲欧美一区二区在线观看| 欧美极品在线观看| 亚洲欧洲视频| 99一区二区| 欧美日韩亚洲一区二区三区在线| 亚洲人精品午夜| 99视频热这里只有精品免费| 欧美国产一区二区三区激情无套| 亚洲国产美女精品久久久久∴| 最新日韩精品| 欧美大色视频| 最新亚洲视频| 在线综合亚洲| 国产精品白丝av嫩草影院| 一区二区三区欧美视频| 亚洲男人av电影| 国产精品一区二区三区四区| 午夜精品免费在线| 久久精品论坛| 在线日韩中文| 欧美成人首页| 日韩午夜电影| 亚洲自拍偷拍视频| 国产欧美日韩视频在线观看 | 欧美~级网站不卡| 最新国产成人在线观看| 欧美激情一区二区三区高清视频 | 国产日韩欧美三区| 久久蜜桃精品| 亚洲欧洲日本在线| 亚洲在线视频观看| 国产亚洲欧美激情| 老牛影视一区二区三区|