移动逻辑学习
设计思路分析:
Pc通知Server移动,Server广播给其他Pc来同步,每个Pc根据收到的Server发过来的移动的参数来模拟移动。这就有一个问题需要考虑,每次的移动协议在多长时间内有效?即如果Pc移动参数不变,而且一直移动的话,Server和周围Pc就一直模拟么? 这样会不会出现问题,比如移动误差。需要规定每个移动包的有效时间。
玩家操作对应的逻辑:
通过键盘来操作
- 按下键盘,开始移动
- 跳跃,对于假3D来说,跳跃是假的,位置不变
- 松开按键,停止移动
通过鼠标来操作
- 按住鼠标,玩家向鼠标所在位置移动。
- 鼠标点击远处,玩家向点击出移动。
从逻辑层面来看,无论是键盘和鼠标操作,都可以分为 StartMove----->TurnRound------>StopMove三种操作,因此,移动参数可以为
float curX;
float curY;
u32 speed;
t_uint16 dir;
t_uint8 moveFlag; // StartMove、TurnRound、StopMove
t_uint16 clientTime;
移动验证:
角色在游戏内移动时,服务器需要验证什么?
- 位置验证
-
- HandleDeltaMove时,如果当前角色未移动(spd==0),验证Pc位置
- UpdateDeltaMove时,如果目标点不合法,使用服务器的位置
- 速度验证
-
- Server HandleDeltaMove时,如果当前角色正在移动,验证Pc速度
- 当前移动包(如果存在)的有效时间验证
-
- HandleDeltaMove时,如果正在移动,验证ServerTime和ClientTime偏差,需要考虑Pc和Server帧数不一致的问题
- 角色死亡时使用服务器的位置
验证失败如何处理? 验证失败,清空pc的移动队列,pc使用服务器位置
位移技能处理思路
对于定时和定速技能处于LoopBegin阶段时,主角Pc在收到技能协议时,向Server发送StartMove的协议,在移动结束时,向Server发送StopMovede 协议。无论是第三方Pc还是主角Pc,都自己模拟角色在位移技能之间的移动。但是,Server在此时不处理角色的移动,只是在技能释放时将角色位置设成技能的目标点。
浙公网安备 33010602011771号