• <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>

            天行健 君子當自強而不息

            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 閱讀(241) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            青青草原综合久久大伊人精品| 久久久久久狠狠丁香| 成人国内精品久久久久一区| 久久久久久久综合日本亚洲| 久久久WWW成人免费毛片| 亚洲精品国产自在久久| 色欲综合久久躁天天躁蜜桃 | 久久精品国产亚洲AV电影| 亚洲欧美精品伊人久久| 久久久久无码国产精品不卡| 欧美一区二区三区久久综| 97精品国产91久久久久久| 色天使久久综合网天天| 国产成人精品久久一区二区三区| 欧美亚洲日本久久精品| 国产A三级久久精品| 国产高潮国产高潮久久久91| 人人狠狠综合久久88成人| 一本久道久久综合狠狠爱| 久久精品国产精品亚洲人人| 久久久久久亚洲Av无码精品专口 | 亚洲综合精品香蕉久久网97| 久久精品国产亚洲AV影院| 久久综合久久性久99毛片| 狠狠色婷婷久久一区二区三区 | 久久无码人妻一区二区三区午夜| 无码乱码观看精品久久| 精品久久久久久久中文字幕| 99热精品久久只有精品| 少妇内射兰兰久久| 亚洲熟妇无码另类久久久| 久久人与动人物a级毛片| 中文字幕无码久久人妻| 精品伊人久久久| 7777精品久久久大香线蕉| 777午夜精品久久av蜜臀| 99蜜桃臀久久久欧美精品网站| 国内精品伊人久久久久妇| 久久久久久国产精品美女| 久久中文字幕视频、最近更新| 亚洲精品国产自在久久|