SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4835|回复: 1
打印 上一主题 下一主题

[network] 多人游戏

[复制链接]

149

主题

331

帖子

2445

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2445
跳转到指定楼层
楼主
发表于 2020-9-5 18:41:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
多人游戏分本地游戏和联机游戏,本地游戏的另一个叫法就是随机地图。
多人游戏步骤
联机游戏.创建联机游戏.加入联机游戏.观看本地游戏
大厅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;
回复

使用道具 举报

149

主题

331

帖子

2445

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2445
沙发
 楼主| 发表于 2020-9-5 18:42:39 | 只看该作者
加入者如何知道他在场景中是本地玩家?
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。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2025-5-1 22:46 , Processed in 0.048015 second(s), 22 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表