SDL中文论坛

标题: 为同步(网络、回放录像),编程上要注意 [打印本页]

作者: ancientcc    时间: 2020-9-5 18:47
标题: 为同步(网络、回放录像),编程上要注意
一、能改变城市内三个列表顺序的操作
三个列表指“未”武将、“完”武将,城内部队。像出征时,取消出征操作要使出征部队回到原来位置;像AI操作时,不要动不动就排序城内部队,AI排序过了的“录像回放”也一定要让排序。
一旦城市被攻陷,部队/武将去哪个城是严格按照列表中顺序来的。

二、怎么会出现以下的一连同一个地点出发的move命令
  1. [command]
  2.         [move]
  3.                 x="19,18,17,16,15"
  4.                 y="5,4,4,3,3"
  5.         [/move]
  6. [/command]
  7. [command]
  8.         [move]
  9.                 x="19,18,17,16,15"
  10.                 y="5,4,4,3,3"
  11.         [/move]
  12. [/command]
复制代码
可能原因:一些操作执行后,该有清空undo_stack!举个例子,把N个武将从A城移动B城,但不清空undo_stack;
1:把部队从(19,5)移动到(15,3);(命令池中多一条move命令)
2:N个武将被从A城移动B城;(命令池中多一条move_heros命令)
3:玩家按下“撤消”,由于undo_stack不空,部队根据undo_stack从(15,3)移回到了(19,5),同时命令池中最上那条move_heros命令被删除。
4:玩家又把部队从(19,5)移动到(15,3);(命令池中多一条move命令)
————于是致出现以上写的两条连续move命令。
解决,该把undo_stack清空的就该清掉,该清掉操作有:移动武将、征兵、解散部队、建造。

unit_map::scout_unit_部队计算路程时,要使用pathfind::emergency_path_calculator,而不是pathfind::shortest_path_calculator。
即使已使能“忽略zoc”,shortest_path_calculator依旧和地图当前部队分布相关,也就是说,同样是两个城市,不同时刻用它计算路程时可能会出不一样结果。这就可能造成两个问题。

emergency_path_calculator在计算路程时只和地形有关,和部队分布无关。但这里要注意一个问题,一旦将来支持动态改地图,这时需要把缓存的路程清空,以让重新计算。

mr_data.own_cities类型是std::map<int, enemy_data>,不能是std::map<artifical*, enemty_data>。
std::map是排序容器,使用std::map<artifical*, enemty_data>时,它会按“artifical*”指针值进行排序,这就造成不同运行实例时各城市顺序可能不一样,从而导致回放不同步。使用std::map<int, enemy_data>,其中“int”是cityno,这会保证每次运行城市顺序都是一致。

移动力须保持同步
一只部队处于被挑衅,假设在位置上它既不能移动又不能攻击,在进入end_turn前,实时情况下它的移动力要被置0,由于被置0,它下回合不会进入resting状态。可在录像情况下,由于该部队什么命令也没有,它的移动力没变化,依旧保持满,致使会让进入resting状态。——由于一个没resting、一个有resting,导致出来hp不同步。

解决办法
实时时应该把修改了移动以命令形式发向回放器。
当前解决办法是增加个能一不能进入resting状态判断(no_enter_resting)。接下要做部队任务,可能会和这个有关,到时再决定怎么改。






欢迎光临 SDL中文论坛 (http://www.libsdl.cn/bbs/) Powered by Discuz! X3.3