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

天行健 君子當自強而不息

Getting Online with Multiplayer Gaming(15)

 

Working with Game Clients

The client application (referred to as the client) is the conduit between the gaming
server and the player. The client accepts the user’s input and forwards it to the server.
Between updates from the server, the client updates itself based on what little information
it has—the player’s movement, other players’ movements, NPC actions, and so on.

The client uses graphics, sound, and input-processing to work its magic. However,
if you were to strip away the graphics and sound, you would be left with a rather
bland application. This “dumb” client structure might look unworthy, but believe
me, it will work perfectly for your game project.

To use the Client application, you can follow these steps:

1. Locate and run the Client application. The Connect to Server dialog box
(shown in Following snap) appears.

Besides picking an adapter and entering a player name, you’ll need to know the server’s IP address in order to connect and play the game.

2. In the Connect to Server dialog box, enter the host’s IP address, select an
adapter, and enter your player’s name.

3. Click OK to begin the game and connect to the server.

The client works almost identically to the server in some respects, the first of which
is dealing with players.

 

Handling Player Data

The client, much like the server, uses an sPlayer structure that contains the information
about each connected player in the game. This time, however, information is
needed to track the 3-D object for drawing the player (as well as the weapon) and
the player animation being played. Other than that, you can see many similarities
between the sPlayer structure being used by the client and server. Take a look at
the declaration of the client’s sPlayer structure (along with supporting macros):

#define MAX_PLAYERS           8     // Maximum number of players allowed to be connected at once

#define STATE_IDLE            1 
#define STATE_MOVE            2
#define STATE_SWING           3
#define STATE_HURT            4

#define ANIM_IDLE             1
#define ANIM_WALK             2
#define ANIM_SWING            3
#define ANIM_HURT             4

typedef 
struct sPlayer
{
    
bool    connected;    
    DPNID   player_id;

    
long    last_state;      
    
long    last_update_time;
    
long    latency;

    
float   x_pos, y_pos, z_pos;
    
float   direction;
    
float   speed;

    cObject body;
    cObject weapon;
    
long    last_anim;

    
///////////////////////////////////////////////////////////////
    
    sPlayer()
    {
        connected        = 
false;
        player_id        = 0;
        last_anim        = 0;
        last_update_time = 0;
    }
} *sPlayerPtr;

Again, an array of sPlayer structures is allocated to hold the player information.
Each player is allowed to use a separate Graphics Core object for the character’s
body and weapon mesh. The local player uses the first element in the player data
array (defined as m_players in the application class), although joining players are
stuffed into the first empty slot found.

#define MSG_CREATE_PLAYER     1
#define MSG_GET_PLAYER_INFO   2
#define MSG_DESTROY_PLAYER    3
#define MSG_STATE_CHANGE      4

typedef 
struct sMsgHeader
{
    
long    type;       // type of message (MSG_*)
    long    size;       // size of data to send
    DPNID   player_id;  // player performing action
} *sMsgHeaderPtr;

typedef 
struct sMsg     // The message queue message structure
{
    sMsgHeader  header;
    
char        data[512];
} *sMsgPtr;

typedef 
struct sCreatePlayerMsg
{
    sMsgHeader  header;
    
float       x_pos, y_pos, z_pos;    // Create player coordinates
    float       direction;
} *sCreatePlayerMsgPtr;

typedef 
struct sRequestPlayerInfoMsg
{
    sMsgHeader  header;
    DPNID       request_player_id;      
// which player to request
} *sRequestPlayerInfoMsgPtr;

typedef 
struct sDestroyPlayerMsg
{
    sMsgHeader header;
} *sDestroyPlayerMsgPtr;

typedef 
struct sStateChangeMsg
{
    sMsgHeader  header;
    
    
long        state;                  // State message (STATE_*)
    float       x_pos, y_pos, z_pos;
    
float       direction;
    
float       speed;
    
long        latency;
} *sStateChangeMsgPtr;

/****************************************************************************************************/

class cApp : public cFramework
{
private:
    CRITICAL_SECTION    m_update_cs;    

    cInput              m_input;
    cInputDevice        m_keyboard;
    cInputDevice        m_mouse;

    cMesh               m_terrain_mesh;
    cNodeTreeMesh       m_nodetree_mesh;

    cMesh               m_char_mesh;
    cMesh               m_weapon_mesh;
    cAnimation          m_char_anim;

    cCamera             m_camera;
    
float               m_cam_angle;
    
    cNetworkAdapter     m_adapter;
    cClient             m_client;
    GUID*               m_adapter_guid;

    
char                m_host_ip[16];
    
char                m_player_name[32];

    
long                m_num_players;
    sPlayer*            m_players;    

    ID3DXFont*          m_font;

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

public:
    cApp();

    
virtual bool init();
    
virtual bool frame();
    
virtual void shutdown();
    
    
bool receive(const DPNMSG_RECEIVE* msg);
    
void set_info(GUID* adapter_guid, const char* host_ip, const char* player_name);

    
void set_local_player(DPNID player_id);

private:
    
bool select_adapter();
    
bool init_game();
    
bool join_game();    

    
void update_all_players();
    
void render_scene();

    
bool send_network_msg(void* msg, long send_flags);
    
long get_player_index(DPNID player_id);

    
void create_player(const sMsg* msg);
    
void destroy_player(const sMsg* msg);
    
void change_player_state(const sMsg* msg);
};

BOOL CALLBACK connect_dialog_proc(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam);

As the application class for the client is initialized, all character and weapon
meshes are loaded and assigned to each of the player data structures. This is your
first chance to customize your network game; by loading different meshes, you can
have each player appear differently. For example, one character can be a warrior,
another character a wizard, and so on.

A list of animations is also loaded. Those animations represent the various states of
players: a walking animation, standing still (idle), swinging a weapon, and finally a
hurt animation. Those animations are set by the update_all_players function, which you
see in a bit in the section “Updating Local Players.”

One extra tidbit in the sPlayer structure is a DirectPlay identification number.
Clients normally don’t have access to their identification numbers; those are left
for the server to track. However, clients are designed so that their identification
numbers track all players, and in order to start playing, all clients must request
their identification number from the server.

When a game message is received from the server, the client application scans
through the list of connected players. When the player identification number from
the local list of players and from the server is matched, the client knows exactly
which player to update.

The client uses a function called get_player_index to scan the list of players and return
the index number of the matching player (or -1 if no such match is found):

long cApp::get_player_index(DPNID player_id)
{
    
// scan list looking for match
    for(long i = 0; i < MAX_PLAYERS; i++)
    {
        
if(m_players[i].player_id == player_id && m_players[i].connected)
            
return i;
    }

    
return -1;  // no found in list
}

From now on, the client will always use the get_player_index function to determine
which player to update. If a player is not found in the list but is known to exist, the
client must send a MSG_GET_PLAYER_INFO message, which requests the player’s information
from the server. In response, the server will return a create-player message to the
requesting client.

But I’m getting a little ahead of myself, so let’s slow things down a bit. Much like
the server, the client uses the Network Core to handle network communications.
Now, take a look at the client component I’m using for the client application.

posted on 2007-12-19 14:55 lovedday 閱讀(301) 評論(0)  編輯 收藏 引用


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


公告

導航

統(tǒng)計

常用鏈接

隨筆分類(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免费看 | 久久夜色精品国产欧美乱| 国产精品ⅴa在线观看h| 一区二区精品在线| 99国产精品久久久| 国产精品多人| 欧美中文在线观看| 久久精品国内一区二区三区| 国产日韩欧美一区二区| 久久成人精品一区二区三区| 午夜精品在线| 黑人操亚洲美女惩罚| 免费欧美高清视频| 欧美成人免费全部观看天天性色| 亚洲三级免费电影| 一个色综合av| 国内精品久久国产| 亚洲二区免费| 欧美日韩中文字幕在线视频| 久久爱www.| 久久综合网色—综合色88| 日韩视频一区二区三区在线播放免费观看 | 裸体丰满少妇做受久久99精品| 久久精品亚洲一区二区| 91久久精品日日躁夜夜躁国产| 亚洲精品一区在线| 国产日韩精品一区二区三区在线 | 亚洲精品四区| 亚洲综合色网站| 亚洲第一精品夜夜躁人人爽| 亚洲三级国产| 国产午夜精品全部视频播放| 欧美国产第一页| 国产精品视频第一区| 欧美成年人网站| 欧美日韩网址| 欧美电影打屁股sp| 欧美视频在线观看免费| 你懂的视频一区二区| 欧美日韩在线播放三区四区| 久久夜色精品国产噜噜av| 欧美日韩视频| 欧美黄色片免费观看| 国产欧美一区二区色老头 | 久久精品国产99| 欧美精品导航| 老司机精品福利视频| 欧美亚州在线观看| 亚洲人精品午夜| 黄色国产精品| 性久久久久久久久久久久| 艳妇臀荡乳欲伦亚洲一区| 久久久久久久久伊人| 亚洲欧美日韩国产一区| 欧美精品亚洲精品| 牛人盗摄一区二区三区视频| 国产日韩一区二区| 亚洲婷婷在线| 亚洲欧美日韩中文播放| 欧美久久久久久久| 亚洲国产一二三| 亚洲三级色网| 欧美激情第10页| 亚洲大胆视频| 亚洲欧洲免费视频| 欧美电影在线| 亚洲国内在线| 日韩一二在线观看| 欧美日韩中文字幕在线| 99视频在线精品国自产拍免费观看| 亚洲精品小视频在线观看| 欧美成人dvd在线视频| 亚洲成人在线视频网站| 亚洲国产天堂网精品网站| 蜜桃av一区| 亚洲高清在线视频| 一本色道精品久久一区二区三区| 欧美成人精品在线视频| 亚洲精品日韩激情在线电影| 99国产成+人+综合+亚洲欧美| 欧美多人爱爱视频网站| 亚洲精品视频在线看| 在线一区视频| 国产精品视频九色porn| 午夜精品久久久久久久白皮肤 | 一区二区免费在线观看| 欧美日韩亚洲不卡| 亚洲一区二区三区视频播放| 久久国产精品99久久久久久老狼| 国产日韩欧美成人| 久久成人精品电影| 欧美第一黄色网| 亚洲视频在线观看视频| 国产欧美日韩一区| 久久免费黄色| 亚洲精品中文在线| 欧美一区二区在线播放| 一区二区三区在线免费视频| 欧美成人精品在线播放| 亚洲视频在线播放| 麻豆国产精品一区二区三区 | 国产欧美日韩三区| 久久久人成影片一区二区三区观看| 欧美成人精品三级在线观看 | 在线看国产一区| 牛牛国产精品| 亚洲免费中文| 欧美高清在线观看| 欧美一区二区高清| 亚洲国产91| 欧美性事免费在线观看| 久久久www| 亚洲人成精品久久久久| 久久久夜精品| 亚洲欧美成人一区二区在线电影| 一区国产精品| 国产精品一区二区黑丝| 欧美国产日韩一区二区| 欧美一区激情视频在线观看| 亚洲激情在线观看| 久久在线91| 欧美中文字幕在线观看| 一区二区久久久久| 亚洲电影中文字幕| 国产亚洲精品久久久久久| 欧美日韩成人在线| 久热爱精品视频线路一| 欧美一级久久| 亚洲一区国产一区| 最新亚洲电影| 欧美成人免费网站| 久久久久久综合| 欧美夜福利tv在线| 亚洲免费在线观看视频| av成人动漫| 亚洲精品乱码久久久久久黑人 | 欧美日韩综合另类| 欧美激情亚洲另类| 美日韩精品免费| 久久久亚洲午夜电影| 性做久久久久久久免费看| 亚洲桃色在线一区| 一本久久综合亚洲鲁鲁| 亚洲美女av在线播放| 亚洲黄色一区| 亚洲精品乱码久久久久久| 欧美激情aⅴ一区二区三区| 久久久久亚洲综合| 久久久久国产精品一区| 久久久国产精品一区二区中文| 欧美在线资源| 久久久美女艺术照精彩视频福利播放| 欧美一区二区三区在线视频| 午夜亚洲视频| 欧美亚洲一区在线| 久久九九99| 久久综合99re88久久爱| 欧美sm极限捆绑bd| 亚洲国产1区| 日韩视频中文字幕| 一区二区三区四区五区视频| 亚洲一区美女视频在线观看免费| 亚洲一区二区综合| 久久久久国产精品人| 玖玖视频精品| 欧美日韩福利在线观看| 欧美日一区二区在线观看 | 国内自拍视频一区二区三区| 国产一区二区三区四区| 在线精品亚洲| 99精品国产一区二区青青牛奶| 一本色道久久综合亚洲精品婷婷 | 欧美激情区在线播放| 亚洲精品在线观| 中日韩高清电影网| 欧美一二区视频| 欧美大片免费观看| 国产精品嫩草99av在线| 伊人影院久久| 亚洲一区二区三区高清 | 亚洲欧美日韩精品久久奇米色影视| 欧美淫片网站| 亚洲国产高清自拍| 亚洲综合欧美| 免费成人网www| 国产精品久久久久久久电影 | 国产丝袜美腿一区二区三区| 亚洲国产专区校园欧美| 亚洲免费一区二区| 欧美岛国在线观看| 亚洲欧美日韩一区在线观看| 欧美ed2k| 精品成人在线观看| 亚洲一区国产一区| 狼人天天伊人久久| 亚洲自拍偷拍麻豆| 欧美精品在线极品| 在线播放视频一区| 午夜伦欧美伦电影理论片| 亚洲国产一区二区三区青草影视|