AS3多人游戏开发—同步人物移动2

  上次我们有探讨到鼠标点击的情况下,人物移动同步的问题(http://www.cnblogs.com/cnas3/archive/2011/05/28/2061028.html),今天我们看看使用方向键控制的人物移动如何实现同步。

  键盘控制和鼠标控制不同的地方在于,鼠标点击我们知道我们的avatar移动的终点,在键盘控制中,我们并不知道终点,但我们可以知道一些其他有用的信息,比如运动方向,速度,当前位置,我们来看看如何利用这些信息。

  假设avatar1是一个玩家1电脑上的人物,它在玩家2电脑上的表示是avatar2,玩家1按下方向键,avatar1开始运动,同时发送当前位置p1,方向,速度给其他玩家,玩家2在经过时间t之后获得信息,我们可以通过时间,速度,方向计算出avatar1当前的位置p2,p2和p1之间的差距是网络延迟造成的,我们虽然可以直接将avatar2拉到p2,但是如果p1和p2的差距太大,将会出现跳跃现象,影响用户感受,所以可以考虑通过提高avatar2的速度,在一定时间内追上avatar1,再减到和avatar1同样的速度以达到平滑的效果。在玩家2收到其他数据之前,它都会认为avatar1在同样的方向上运动,因此我们可以在数据接收的空挡预测avatar1的路径,从而达到同步。玩家1还会定时发送数据出去,avatar2在接收到新数据的时候,会重复以上的计算。

  但是当玩家1突然松开方向键,avatar1停止运动,在消息达到玩家2之前,avatar2还在当前的方向上运动。它收到消息的时候,实际上已经超过了avatar1停止的位置,然后avatar2会往回运动到avatar1的位置。虽然我们知道这个现象是延迟造成的,但会让玩家感觉很奇怪。幸运的是我们有一样东西可以拿来利用,那就是—加速度。

  想一想,当玩家1松开按钮,avatar1并不是立即停止,而是有一个加速度(请注意减速其实也是一种加速度,为负的加速度),慢慢停下来,在这个过程中,它有足够的时间发送消息给玩家2几次消息,使avatar2也能开始减速运动,调整自己的位置和速度,最终和avatar1停止在同样的位置。大家可能会想知道加速应该设置为多少,对此我也没有没有一个统一答案,一般你不应该让你减速的时间小于延迟。减速的时间越长,同步的越平滑,反正我一般让减速运动的时间是延迟时间的2-3倍。

  请使用方向键控制下面的flash,红色表示avatar1,绿色表示avatar2.

  

posted on 2011-08-20 18:55  Dongxue.xie  阅读(1647)  评论(0编辑  收藏  举报

导航