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

天行健 君子當自強而不息

Getting Online with Multiplayer Gaming(10)

 

DirectPlay Messages to Game Messages

As I’ve mentioned before, the server needs to convert the DirectPlay network messages
into the game-related messages you’ve just read about. You accomplish this by
processing incoming player connection, disconnection, and receive data messages from
DirectPlay and converting those messages into game messages.

To accomplish this conversion of messages, you derive a class from cNetworkServer
and override the create_player, destroy_player, and receive functions:

class cServer : public cNetworkServer
{
protected:
    
virtual bool create_player(const DPNMSG_CREATE_PLAYER* msg);
    
virtual bool destroy_player(const DPNMSG_DESTROY_PLAYER* msg);
    
virtual bool receive(const DPNMSG_RECEIVE* msg);
};

Because I’m using the System Core to handle application processing, a problem
quickly arises when dealing with the network. The network component and application
component are two separate entities, which means that neither component is
allowed to modify the other's private data.

As Figure 19.11 illustrates, the network component needs a way to siphon incoming
messages into the application, which by chance is handled by creating three public
functions that match the network class’s functions.

To use the three message functions in the application component, you construct a
derived cFramework class that contains the three public functions as follows:

class cApp : public cFramework
{
private:
    HWND                m_controls[3];
    
    CRITICAL_SECTION    m_msg_cs;
    cMesh               m_level_mesh;

    GUID*               m_adapter_guid;
    cNetworkAdapter     m_adapter;
    cServer             m_server;

    
long                m_connected_player_num; 
    sPlayer*            m_players;

    sMsg*               m_msgs;
    
long                m_msg_head;
    
long                m_msg_tail;

    
///////////////////////////////////////////////////////////////////////////////

public:
    
void set_adapter_guid(GUID* adapter_guid)
    {
        m_adapter_guid = adapter_guid;
    }

public:
    cApp();
    
    
virtual bool init();
    
virtual bool frame();
    
virtual void shutdown();

    
void create_player(const DPNMSG_CREATE_PLAYER* msg);
    
void destroy_player(const DPNMSG_DESTROY_PLAYER* msg);
    
void receive(const DPNMSG_RECEIVE* msg);

private:
    
bool select_adapter();
    
void setup_app_window();
    
bool init_game();
    
bool host_game();    

    
void list_players();

    
void process_queue_msg();
    
void update_players();
    
void update_network();
    
void update_latency();

    
bool send_player_info(const sMsg* msg, DPNID to);
    
bool queue_msg(const void* msg);
    
bool add_player(const sMsg* msg);
    
void remove_player(const sMsg* msg);
    
bool player_state_change(const sMsg* msg);

    
bool send_network_msg(void* msg, long send_flags, int to);

    
bool check_intersect(cMesh* mesh,
                         
float x_start, float y_start, float z_start,
                         
float x_end,   float y_end,   float z_end);
};

To start sending DirectPlay messages to the application class, you code the overridden
cServer functions to call upon the matching application functions. In order for the
server to know which application class instance to send messages to, you need to
declare a global variable that points to the current application class instance in use:

cApp* g_app;
cNetworkAdapter* g_adapter;

Inside the derived application class’s constructor, you then point the global
g_app variable to the application class instance:

cApp::cApp()
{    
    m_adapter_guid = NULL;
    m_msgs         = NULL;
    m_msg_head     = 0;
    m_msg_tail     = 0;

    m_connected_player_num = 0;
    m_players = NULL;

    g_app     = 
this;
    g_adapter = &m_adapter;

    InitializeCriticalSection(&m_msg_cs);
}

Now, you can code the network server component to send incoming messages to
the application object defined by the global g_app pointer:


bool cServer::create_player(const DPNMSG_CREATE_PLAYER* msg)
{
    g_app->create_player(msg);

    
return true;
}

bool cServer::destroy_player(const DPNMSG_DESTROY_PLAYER* msg)
{
    g_app->destroy_player(msg);

    
return true;
}

bool cServer::receive(const DPNMSG_RECEIVE* msg)
{
    g_app->receive(msg);

    
return true;
}

The server component is now complete and is forwarding network messages to the
application class. To convert those network messages to game-related messages,
the application class must contain the following public functions:


void cApp::create_player(const DPNMSG_CREATE_PLAYER* msg)
{
    sCreatePlayerMsg create_msg;

    create_msg.header.type      = MSG_CREATE_PLAYER;
    create_msg.header.size      = 
sizeof(sCreatePlayerMsg);
    create_msg.header.player_id = msg->dpnidPlayer;

    queue_msg(&create_msg);
}

///////////////////////////////////////////////////////////////////////////////////////

void cApp::destroy_player(const DPNMSG_DESTROY_PLAYER* msg)
{
    sDestroyPlayerMsg destroy_msg;

    destroy_msg.header.type      = MSG_DESTROY_PLAYER;
    destroy_msg.header.size      = 
sizeof(sDestroyPlayerMsg);
    destroy_msg.header.player_id = msg->dpnidPlayer;

    queue_msg(&destroy_msg);
}

///////////////////////////////////////////////////////////////////////////////////////

void cApp::receive(const DPNMSG_RECEIVE* msg)
{
    sMsgHeader* header = (sMsgHeader*) msg->pReceiveData;

    
// make sure it is a valid message type and queue it
    switch(header->type)
    {
    
case MSG_SEND_PLAYER_INFO:
    
case MSG_STATE_CHANGE:
        queue_msg(msg->pReceiveData);
        
break;
    }
}

You can see that in each of the three functions, I’m constructing a game-related
message using the data from the DirectPlay messages provided. When a player tries
to connect to the server, a create-player message is created that stores the connecting
player’s DirectPlayer identification number (along with the message type and size).
That create-player message is then queued.

As for players disconnecting from the game, a disconnect-player message is constructed
and queued. Last, whenever data (other than a system message) is
received from a client, the cApp::receive function checks it to see whether it’s a valid
message type, and if so, the message is queued.

I keep mentioning the message queue and how the previously shown function adds
messages to the queue. Next, you find out what the queue is and how it works.

posted on 2007-12-18 20:35 lovedday 閱讀(253) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲一级在线| 欧美xx视频| 一区二区三区精品国产| 欧美香蕉大胸在线视频观看| 亚洲欧美日韩一区二区三区在线观看| 久久中文在线| 欧美激情精品久久久久久免费印度 | 国产欧美在线观看一区| 国产精品久久久久久久久婷婷| 欧美成人四级电影| 欧美激情一区三区| 国产精品久久久久aaaa| 欧美日本乱大交xxxxx| 欧美精品在线网站| 国产精品嫩草久久久久| 国产伦精品一区二区三区照片91| 国产精品yjizz| 国产一区亚洲一区| 最新精品在线| 亚洲一区二区三区777| 亚洲一区影音先锋| 欧美亚洲综合久久| 男女精品视频| 亚洲欧洲精品一区二区三区| 久久国产福利| 毛片精品免费在线观看| 欧美福利精品| 国产精品成人播放| 亚洲国产精品v| 亚洲伊人网站| 久久午夜电影| 99www免费人成精品| 亚洲——在线| 欧美精品在线免费| 伊人成年综合电影网| 一本大道久久精品懂色aⅴ| 香蕉久久精品日日躁夜夜躁| 久久精品人人做人人综合| 亚洲欧洲日韩在线| 免费日韩成人| 亚洲国产精品悠悠久久琪琪| 在线看一区二区| 午夜在线电影亚洲一区| 欧美freesex8一10精品| 这里只有精品在线播放| 久久综合狠狠综合久久综合88| 欧美伦理a级免费电影| 在线看片第一页欧美| 欧美一区二视频| 亚洲视频成人| 国产精品久久久久久亚洲调教| 亚洲国产精品日韩| 久久久精品网| 欧美影院精品一区| 国产香蕉97碰碰久久人人| 亚洲一区二区成人在线观看| 久久久99爱| 欧美在线精品免播放器视频| 欧美日韩激情网| 一区二区三区国产盗摄| 国产日韩一区在线| 亚洲综合国产激情另类一区| 久久一区二区三区四区五区| 亚洲破处大片| 欧美久久久久免费| 在线亚洲激情| 亚洲午夜小视频| 国产精品入口尤物| 欧美一激情一区二区三区| 亚洲一区二区三区在线观看视频 | 亚洲国产成人久久综合一区| 翔田千里一区二区| 激情综合色综合久久| 午夜性色一区二区三区免费视频| 国产精品99久久久久久久久 | 久久国产精品72免费观看| 国产小视频国产精品| 久久米奇亚洲| 麻豆9191精品国产| 亚洲深夜av| 久久精品一区蜜桃臀影院 | 国产婷婷色一区二区三区在线| 性做久久久久久久免费看| 亚洲欧美在线aaa| 伊人激情综合| 夜色激情一区二区| 久久久九九九九| 亚洲第一页在线| 亚洲伦伦在线| 国产精品国色综合久久| 欧美午夜在线视频| 久久er精品视频| 亚洲国产高清一区| 亚洲精品一区二区三区在线观看| 欧美二区在线| 亚洲综合成人在线| 久久人人爽国产| 亚洲一区二区高清| 久久九九全国免费精品观看| 国产原创一区二区| 999亚洲国产精| 国产一区在线播放| 亚洲美女福利视频网站| 国产精品私房写真福利视频| 久久成人国产| 欧美日韩在线视频一区二区| 亚洲男女自偷自拍| 男女激情视频一区| 久久精品国产99国产精品| 久久夜色精品| 久久一二三四| 中国成人在线视频| 女女同性女同一区二区三区91| 艳女tv在线观看国产一区| 亚洲欧美成人网| 亚洲看片网站| 久久久视频精品| 欧美一区二区高清| 欧美日韩一区二区在线观看视频| 久久裸体艺术| 国产美女扒开尿口久久久| 亚洲国产视频一区| 国产欧美日韩一区二区三区在线观看| 国产亚洲精品久| 99v久久综合狠狠综合久久| 亚洲欧美区自拍先锋| a4yy欧美一区二区三区| 久久国产一区二区三区| 亚洲一区二区三区久久| 欧美 日韩 国产在线 | 久久夜色精品国产| 国产亚洲精久久久久久| 在线视频亚洲欧美| 亚洲无线一线二线三线区别av| 六十路精品视频| 欧美成人精精品一区二区频| 国产精品日韩在线| 亚洲欧美国产毛片在线| 亚洲线精品一区二区三区八戒| 嫩草国产精品入口| 亚洲国产精品一区制服丝袜 | 欧美精品一二三| 亚洲精选视频在线| 亚洲欧美日韩国产综合| 国产精品99免费看 | 欧美成年视频| 亚洲欧洲综合| 欧美日韩国产丝袜另类| 久久超碰97中文字幕| 欧美精品一级| 欧美日韩黄色一区二区| 国一区二区在线观看| 国产精品v片在线观看不卡| 午夜一级在线看亚洲| 久久精品国产欧美激情| 欧美中文字幕在线| 一区在线视频| 欧美美女bbbb| 亚洲在线观看视频| 久久午夜电影网| 99re热精品| 国产欧美一区二区三区在线老狼| 午夜精品久久久久久久99黑人| 欧美在线1区| 91久久精品国产91久久| 欧美激情一区二区| 亚洲综合日本| 免费成人高清| 欧美一区二区女人| 亚洲青涩在线| 亚洲欧美日韩精品一区二区| 欧美激情综合色综合啪啪| 亚洲精品在线观看免费| 亚洲女优在线| 亚洲国产成人精品女人久久久| 免费在线国产精品| 亚洲欧美综合精品久久成人| 久久www免费人成看片高清| 国产一区二区看久久| 久久精品女人| 亚洲一区三区视频在线观看| 性色av一区二区怡红| 在线欧美日韩国产| 国产精品丝袜xxxxxxx| 美女黄毛**国产精品啪啪| av成人老司机| 99天天综合性| 欧美色道久久88综合亚洲精品| 亚洲国产精品美女| 亚洲欧美美女| 亚洲国产小视频| 久久夜色精品亚洲噜噜国产mv| 一区二区三区日韩欧美精品| 亚洲欧美在线一区二区| 久久最新视频| 久久阴道视频| 久久一二三区| 国产一区二区剧情av在线| 欧美夫妇交换俱乐部在线观看| 欧美精品一区二区三区蜜臀|