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

天行健 君子當自強而不息

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>
            小嫩嫩精品导航| 中文在线资源观看网站视频免费不卡 | 欧美电影免费网站| 亚洲性感美女99在线| 亚洲另类黄色| 一区电影在线观看| 亚洲一区亚洲| 久久成人这里只有精品| 亚洲欧美久久久| 久久精品国产在热久久| 浪潮色综合久久天堂| 欧美激情网友自拍| 欧美激情亚洲国产| 国产精品xxxxx| 国产在线欧美| 亚洲日本欧美天堂| 一本久久a久久精品亚洲| 亚洲欧美伊人| 欧美成人精精品一区二区频| 亚洲美女色禁图| 欧美影视一区| 欧美老女人xx| 国产视频久久网| 欧美日韩在线影院| 国产午夜久久久久| 狠狠色丁香婷婷综合| 99热在线精品观看| 欧美中文在线观看| 亚洲电影在线看| 9人人澡人人爽人人精品| 欧美影院视频| 欧美私人啪啪vps| 亚洲欧洲三级| 久久久精品欧美丰满| 日韩亚洲国产欧美| 蜜臀a∨国产成人精品| 国产伦精品一区二区三区四区免费| 国内成人精品2018免费看 | 欧美激情一区二区三区在线视频观看 | 久久精品电影| 欧美小视频在线| 亚洲国产日韩精品| 久久精品青青大伊人av| 91久久久精品| 久久免费一区| 国产日韩一级二级三级| 中文av一区特黄| 亚洲第一久久影院| 久久精品国产一区二区三区| 国产精品欧美日韩| 夜夜爽www精品| 久久麻豆一区二区| 午夜欧美精品| 国产精品色午夜在线观看| 亚洲精选成人| 欧美国产一区二区在线观看| 欧美在线视频播放| 国产亚洲免费的视频看| 欧美中文在线字幕| 亚洲欧美福利一区二区| 国产精品视屏| 欧美永久精品| 欧美亚洲一区二区在线观看| 欧美午夜久久| 亚洲制服丝袜在线| 日韩天堂在线观看| 欧美日韩少妇| 亚洲综合色在线| 亚洲图片欧美午夜| 国产精品永久免费观看| 欧美一区网站| 久久精品人人做人人爽| 亚洲高清三级视频| 欧美国产三区| 欧美视频福利| 国产视频不卡| 欧美手机在线| 小黄鸭视频精品导航| 亚洲免费婷婷| 国产一区999| 免费看的黄色欧美网站| 麻豆精品在线视频| 一区二区三欧美| 99日韩精品| 国产精品一区久久久| 久久嫩草精品久久久久| 久久婷婷影院| aa级大片欧美三级| 亚洲在线视频| 国一区二区在线观看| 亚洲电影在线看| 免费在线观看成人av| 一区二区三区精品在线| 亚洲在线观看视频| 亚洲国产综合视频在线观看| 日韩午夜在线电影| 国内精品伊人久久久久av一坑| 欧美a级大片| 欧美性久久久| 久久综合给合久久狠狠色| 欧美高潮视频| 午夜精品成人在线视频| 久久阴道视频| 亚洲午夜久久久久久尤物| 亚洲欧美视频在线| 亚洲国产精品视频一区| 亚洲视频在线二区| 亚洲电影在线看| 亚洲无毛电影| 亚洲精品美女在线| 欧美一区三区三区高中清蜜桃| 亚洲日韩中文字幕在线播放| 午夜精品在线看| 一区二区三区欧美| 麻豆成人小视频| 性视频1819p久久| 欧美成人一区二区三区| 久久欧美肥婆一二区| 国产精品九九| 91久久精品一区二区别| 18成人免费观看视频| 性欧美超级视频| 午夜精品理论片| 欧美国产精品va在线观看| 看片网站欧美日韩| 国产日韩精品电影| 日韩午夜免费视频| 一区二区三区www| 免费亚洲电影| 欧美jizz19hd性欧美| 国产一区二区在线免费观看| 亚洲综合视频在线| 亚洲欧美另类中文字幕| 欧美日韩亚洲一区二区三区在线| 亚洲高清久久| 亚洲欧洲另类国产综合| 蜜臀99久久精品久久久久久软件| 久久视频精品在线| 国产亚洲福利| 欧美在线亚洲综合一区| 欧美日韩国产精品一卡| 久久影院午夜片一区| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久视频在线视频| 国产日韩欧美一区| 欧美在线一级视频| 久久综合给合| 亚洲欧洲视频在线| 欧美经典一区二区三区| 日韩视频一区二区三区在线播放免费观看| 亚洲精品一二区| 欧美日韩亚洲一区在线观看| aa级大片欧美三级| 亚洲一区二区三区在线播放| 国产精品r级在线| 亚洲女同精品视频| 久久久久综合一区二区三区| 激情五月***国产精品| 久久天天狠狠| 亚洲人成艺术| 亚洲已满18点击进入久久| 国产精品一区二区三区久久| 久久不见久久见免费视频1| 欧美高清在线观看| 亚洲综合色网站| 亚洲第一区在线观看| 欧美精品尤物在线| 亚洲欧美国产毛片在线| 免费观看不卡av| 宅男噜噜噜66一区二区| 国产毛片一区| 免费黄网站欧美| 亚洲视频福利| 免费影视亚洲| 亚洲综合久久久久| 亚洲国产精品www| 国产精品久久久久久久午夜片| 久久国产日韩| 日韩网站在线观看| 能在线观看的日韩av| 亚洲天堂偷拍| 黑人一区二区三区四区五区| 欧美日本亚洲视频| 久久福利毛片| 野花国产精品入口| 欧美激情一区二区三区不卡| 亚洲欧美偷拍卡通变态| 亚洲精品在线三区| 国内视频一区| 国产精品嫩草影院一区二区| 老牛影视一区二区三区| 亚洲自拍高清| 亚洲精品在线三区| 久久一区二区三区四区| 午夜精品亚洲一区二区三区嫩草| 亚洲国产视频直播| 国产在线国偷精品产拍免费yy| 国产精品久久久久999| 欧美激情影院| 欧美顶级少妇做爰|