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

天行健 君子當(dāng)自強(qiáng)而不息

Getting Online with Multiplayer Gaming(17)

 

Message Handling

The client application uses the same message structures as the server, but the client
has no need for queuing messages. As Figure 19.16 demonstrates, incoming messages
are immediately parsed by the client.

Now that you’ve seen the receive function that handles incoming message, it’s time
to examine each message handling function.

 

cApp::create_player

As clients join the game, the server informs other connected clients of those new
arrivals. The purpose of the following create_player function is to find room in the
sPlayer structure and store the player data:

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

    
// do not add local player to list
    if(create_msg->header.player_id == m_players[0].player_id)
        
return;

    
long player_index = -1;

    
for(long i = 1; i < MAX_PLAYERS; i++)
    {
        
if(m_players[i].connected)
        {
            
// makre sure player not already in list
            if(m_players[i].player_id == create_msg->header.player_id)
                
return;
        }
        
else
            player_index = i;
    }

    
if(player_index == -1)  // no open slots
        return;

    EnterCriticalSection(&m_update_cs);

    
// add player data
    m_players[player_index].connected  = true;
    m_players[player_index].player_id  = create_msg->header.player_id;
    m_players[player_index].x_pos      = create_msg->x_pos;
    m_players[player_index].y_pos      = create_msg->y_pos;
    m_players[player_index].z_pos      = create_msg->z_pos;
    m_players[player_index].direction  = create_msg->direction;
    m_players[player_index].speed      = 0.0f;
    m_players[player_index].last_state = STATE_IDLE;

    m_num_players++;

    LeaveCriticalSection(&m_update_cs);
}

 

cApp::destroy_player

The server notifies clients when a player is leaving a session. The clients, in turn,
signal the player as being disconnected and skips updating the player during the
update cycle. The following code determines which client is disconnected and
takes the appropriate steps:

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

    
// do not remove local player from list
    if(destroy_msg->header.player_id == m_players[0].player_id)
        
return;

    
long player_index = get_player_index(destroy_msg->header.player_id);
    
if(player_index == -1)
        
return;

    EnterCriticalSection(&m_update_cs);

    m_players[player_index].connected = 
false;
    m_num_players--;

    LeaveCriticalSection(&m_update_cs);
}
 

cApp::change_player_state

The client processes changes of state in players by pulling out the message data and
putting it in the player’s structure. If a player isn’t found in the list of players, the
client requests that player’s information via a MSG_GET_PLAYER_INFO message and exits the
change_player_state function without further ado.

This is the only situation in which a player’s coordinates can be directly modified
by a state change—clients are not allowed to make direct changes to their coordinates
(to avoid cheating), so it’s up to the server to tell players just where they are
in the world during the updates:

void cApp::change_player_state(const sMsg* msg)
{
    sStateChangeMsg* change_msg = (sStateChangeMsg*) msg;

    
long player_index = get_player_index(change_msg->header.player_id);

    
if(player_index == -1)  // unknown player - request information
    {
        sRequestPlayerInfoMsg request_msg;

        request_msg.header.type       = MSG_GET_PLAYER_INFO;
        request_msg.header.size       = 
sizeof(sRequestPlayerInfoMsg);
        request_msg.header.player_id  = m_players[0].player_id;
        request_msg.request_player_id = change_msg->header.player_id;

        send_network_msg(&request_msg, DPNSEND_NOLOOPBACK);
        
return;
    }

    EnterCriticalSection(&m_update_cs);

    
// store new player state information
    m_players[player_index].last_state = change_msg->state;
    m_players[player_index].x_pos      = change_msg->x_pos;
    m_players[player_index].y_pos      = change_msg->y_pos;
    m_players[player_index].z_pos      = change_msg->z_pos;
    m_players[player_index].direction  = change_msg->direction;
    m_players[player_index].speed      = change_msg->speed;
    m_players[player_index].latency    = change_msg->latency;

    
// bounds latency to 1 second
    if(m_players[player_index].latency > 1000)
        m_players[player_index].latency = 1000;

    
// adjust time based on latency
    m_players[player_index].last_update_time = timeGetTime() - m_players[player_index].latency;

    LeaveCriticalSection(&m_update_cs);
}

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

bool cApp::send_network_msg(void* msg, long send_flags)
{
    sMsgHeader* header = (sMsgHeader*) msg;

    
if(header->size == 0)
        
return false;

    
return m_client.send_data(msg, header->size, send_flags);
}

Just like the server, the client has a send_network_msg to send the game-related
network messages to the server.

NOTE
The client also depends on the latency time to modify
the timing calculations.The server sends this latency
time to the client, but to make things safe, the client
application is allowed to cut the latency down to one
second if the server states that it is higher.


posted on 2007-12-19 16:44 lovedday 閱讀(248) 評論(0)  編輯 收藏 引用


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


公告

導(dǎo)航

統(tǒng)計

常用鏈接

隨筆分類(178)

3D游戲編程相關(guān)鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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久久久久99按摩| 在线免费观看视频一区| 久久久亚洲成人| 欧美在线视频全部完| 国产亚洲精品bt天堂精选| 一本一本a久久| 久久综合久久久| 久久免费视频在线| 国产精品三区www17con| 亚洲一区尤物| 亚洲小视频在线观看| 欧美吻胸吃奶大尺度电影| 91久久在线| 亚洲国产成人午夜在线一区| 久久亚洲精品一区| 亚洲经典自拍| 亚洲精品美女在线观看| 欧美日韩一区二区三区视频| 一区二区三区色| 一区二区三区回区在观看免费视频| 欧美日韩在线观看视频| 亚洲欧美日韩一区在线观看| 亚洲资源av| 狠狠88综合久久久久综合网| 免费亚洲网站| 欧美精品成人| 亚洲免费精彩视频| 久久精品国产v日韩v亚洲| 亚洲国产日韩欧美| 欧美日韩国产综合新一区| 中文网丁香综合网| 亚洲欧美精品一区| 久久久999成人| 欧美日本国产视频| 亚洲午夜伦理| 欧美伊人久久大香线蕉综合69| 亚洲一区二区三区在线视频| 国产精品xxxxx| 午夜精品久久久久久久久久久久久 | 免费人成网站在线观看欧美高清| 亚洲日本成人| 亚洲午夜激情免费视频| 亚洲第一精品福利| 99pao成人国产永久免费视频| 国产精品揄拍500视频| 免费观看国产成人| 国产精品日韩欧美综合| 欧美黄色aaaa| 国产日韩一区二区| 亚洲作爱视频| 亚洲黄色一区| 欧美亚洲综合久久| 亚洲一二三级电影| 欧美成人精品在线视频| 久久精品中文字幕一区二区三区| 欧美丰满少妇xxxbbb| 久久久久91| 国产精品二区在线| 亚洲大片在线观看| 亚洲二区精品| 国产精品日韩欧美综合| 国产亚洲a∨片在线观看| 亚洲国产欧美一区二区三区久久| 国产精品爱久久久久久久| 欧美3dxxxxhd| 国产深夜精品| 亚洲天堂成人| 亚洲一区二区三区四区五区午夜 | 美女国内精品自产拍在线播放| 亚洲一区二区三区在线观看视频| 蜜桃视频一区| 欧美国产日韩一区二区| 激情婷婷亚洲| 欧美亚洲视频| 欧美一区二区成人| 国产精品美女久久久久av超清 | 日韩视频一区二区在线观看| 亚洲第一福利在线观看| 久久精品亚洲精品国产欧美kt∨| 欧美一二三视频| 国产精品久久久久久模特| 99天天综合性| 亚洲制服av| 在线 亚洲欧美在线综合一区| 亚洲直播在线一区| 亚洲一区亚洲| 国产精品日韩在线观看| 亚洲视频成人| 午夜久久福利| 国产日本欧洲亚洲| 久久成人免费| 久久综合久久综合这里只有精品| 国产一区99| 久久久久久久网| 欧美激情精品久久久久久久变态 | 一区二区精品国产| 欧美精品尤物在线| 亚洲每日更新| 亚洲欧美日韩视频一区| 国产精品手机在线| 亚洲欧美一区二区在线观看| 久久国产精品72免费观看| 在线中文字幕一区| 亚洲一区欧美二区| 国产精品日日摸夜夜摸av| 亚洲欧美精品| 欧美成人在线免费观看| 亚洲精品少妇| 国产精品欧美经典| 久久精品国产成人| 亚洲国产小视频在线观看| 亚洲视频一区二区| 国产日韩在线看片| 裸体女人亚洲精品一区| a4yy欧美一区二区三区| 午夜亚洲精品| 亚洲福利视频免费观看| 欧美日韩在线三区| 久久激情综合| 日韩一级在线观看| 久久久久免费观看| 夜夜躁日日躁狠狠久久88av| 国产精品自拍在线| 免费h精品视频在线播放| 亚洲午夜激情网页| 欧美国产另类| 久久国产日韩| 一区二区三区黄色| 尤物九九久久国产精品的特点| 欧美日韩二区三区| 久久久久久欧美| 夜久久久久久| 亚洲高清一二三区| 久久久噜噜噜久噜久久 | 久久久国产精品亚洲一区| 亚洲精品视频在线播放| 国产精品久久久久一区二区| 老牛影视一区二区三区| 亚洲免费视频一区二区| 亚洲国产欧美在线| 另类天堂视频在线观看| 亚洲午夜一级| 亚洲精品午夜精品| 欧美制服丝袜第一页| 亚洲黄色片网站| 国内精品久久久久伊人av| 欧美日韩一区二区三区在线| 久久亚洲综合色| 亚洲一区bb| 99re6这里只有精品| 亚洲第一页在线| 嫩草伊人久久精品少妇av杨幂| 国语自产精品视频在线看一大j8 | 在线日本高清免费不卡| 国产精品成人va在线观看| 牛牛精品成人免费视频| 久久精品视频亚洲| 亚洲男人av电影| 亚洲天堂av在线免费| 日韩视频三区| 亚洲精品一区二区三| 亚洲欧洲另类| 亚洲国产欧美另类丝袜| 欧美激情一区二区三区四区 | 亚洲国产精品悠悠久久琪琪 | 麻豆国产精品一区二区三区| 欧美在线视频免费| 久久狠狠婷婷| 久久精品国产亚洲精品| 香蕉国产精品偷在线观看不卡| 亚洲天堂av综合网| 性欧美精品高清| 性刺激综合网| 欧美一区二区三区在线免费观看| 亚洲欧美文学| 欧美一区1区三区3区公司| 欧美一区二区三区在线播放| 香蕉乱码成人久久天堂爱免费 | 国产午夜精品一区二区三区视频| 欧美三级第一页| 欧美成人一区在线| 老牛嫩草一区二区三区日本| 欧美成人中文字幕| 欧美日韩黄色一区二区| 欧美成人资源| 欧美日韩在线免费视频| 国产精品一区二区欧美| 国内精品免费午夜毛片| 亚洲国产精品久久久久| 一本色道88久久加勒比精品 | 午夜日韩av| 91久久国产综合久久91精品网站|