[network] 多人游戏

多人游戏分本地游戏和联机游戏,本地游戏的另一个叫法就是随机地图。

多人游戏步骤

 联机游戏.创建联机游戏.加入联机游戏.观看本地游戏
大厅I(enter_lobby_mode)创建加入观看--
创建(enter_create_mode)设置----设置
大厅II(enter_connect_mode)设置只有看权限--设置

--:指示不需要该场景。

 

enter_lobby_mode

gui2::tlobby_main:显示大厅I窗口。

enter_create_mode

mp::create ui(...):创建mp::create对象。

run_lobby_loop(disp, ui):显示创建窗口。

enter_connect_mode

mp::connect ui(...):创建mp::connect对象。

mp::connect::connect执行逻辑

  • load_game:生成level_这个config成员变量。
  • lists_init:生成此个关卡中所有[side]对应的mp::connect::side对象。
  • update_level:更新level_中所有[side]块。

run_lobby_loop(...):显示大厅II窗口。

 

为什么游戏大厅II较复杂

1、势力担当集团可能是固定,可能是随机。

2、玩家类型可能是网络玩家、本地玩家、电脑玩家、还可能是置空。

params_

@saved_game: 是否来自存档文件。根据是否是存档文件来判断。mp::connect::load_game。

@mp_scenario: 关卡标识。multiplayer_Basilisk。来自关卡的[multiplayer]块。

@hash:level_计算出的hash值。mp::connect::load_game。

 

params==>level_

[multiplayer]块的变迁史

1、读取,被放在params_.scenario_data。

2、mp::connect::load_game,从params_.scenario_data复制到level_。

 

level_中的块

1、[multiplayer]中的所有块被成为level_直接子块。

2、[multiplayer]块。这个[multiplayer]块不是关卡配置中的[multiplayer],而是存放了params_的内容。

3、[era]块。根据params_.mp_era从game_config()中[era]块组中搜出的[era]块。

以上内容形成都在mp::connect::load_game()函数。load_game()主要事情就是形成level_这个config。

 

mp::connect::side::get_config如何形成[side]块

1、把内部cfg_的赋给[side]块。这个内部cfg_是“初始”[side]块,例如写在关卡cfg中的[multiplayer]下的某个[side]块;例如存档文件中[snapshot]下的某个[side]块。

2、属性controller。会被换为network、human、ai、null、reserved中一种。

3、属性current_player。玩家用户,像ancientcc1

4、属性id。

5、属性player_id。它会在玩家用户后面再加势力序号,像ancientcc11。

6、属性name。

7、属性allow_changes。

 

mp::controller

CNTR_NETWORK = 0, 

CNTR_LOCAL:本地玩家。以本PC上登录的用户,像ancientcc。 

CNTR_COMPUTER:电脑玩家,即AI。 

CNTR_EMPTY:空位。即没有该势力。 

CNTR_RESERVED:给予。

CNTR_LAST;

 

一、加入者如何知道他在场景中是本地玩家?

1、大厅II会把场景发向所有房间内玩家。即使在选择势和控制模式时没有选中该玩家。 

2、加入者玩家收到场景后,play_game中发现它是IO_CLIENT,检查[side]中的current_player字段值正好是自已玩家标识,于是把它置为human。

wait

level_to_gamestate不会把network转为human;

play_game(playcampaign.cpp)执行把network转为human。

相应地创建者也会根据current_player字段去设置controller。也就是说即使在level_to_gamestate之前controller是ai,如果current_player是创建者登录账号也会强制置为human。

全部评论: 0

    写评论: