移动同步问题

玩家在通过摇杆进行移动时,客户端会向服务器发送两个坐标点:客户端起始坐标,客户端预判断的目标坐标。

服务器在收到这两个坐标后,首先会根据客户端的起始坐标做一次位置矫正:如果客户端的位置合理,则将服务器的当前坐标设置为客户端的起始坐标。这样做的好处在于,如果服务器与客户端的位置出现了偏差,可以不将玩家往回拉,让玩家有更好的移动体验。但是这样可能被外挂利用,所以位置纠正只是每隔若干秒做一次,而不是每次移动时都做。

做完位置矫正后,服务器会通过a*寻路找到一组路点,沿着路点向目标点移动。并且在每一帧中将坐标更新同步给客户端。

最近遇到一个实际运行中的bug:客户端并不是完全等服务器的坐标同步之后才移动,而是会自己提前自动。但是客户端在摇杆移动时并没有使用a*,而是直接判断目标点是否是可行走区域,如果是则直接移动到目标点。这样就导致当玩家速度很快的时候可以穿过比较薄的阻挡门(门的厚度小于客户端移动一次摇杆的判定距离),当客户端穿墙之后再次发起自动请求时,发给服务器的起始坐标就在墙另一侧了。服务器如果做了位置纠正,就在服务器端也穿过了墙。

解决的办法是,位置纠正时做一次a*寻路判断,若不可达,则将客服端拉回服务器当前坐标

你可能感兴趣的:(移动同步问题)