0

我目前有一个来自 A* 寻路函数结果的点 (x,y) 数组。设置此数组,以便第一个索引是最接近字符的点,下一个是需要在路径中经过的下一个点。

这些点在一个网格上(目前网格上每个点之间有 8 个像素,这是可以更改的。)

我目前的策略是将角色移动到第一个点,当他到达那个点时,然后移动到下一个点,就这么简单。

我通过创建一个从角色到该点的向量来移动到第一个点,并找出它有多远。然后我找到角度并朝那个方向移动。

// How the character is moved
double xMove = Math.cos(charAngle * (Math.PI / 180)) * 0.1 * delta;
double yMove = Math.sin(charAngle * (Math.PI / 180)) * 0.1 * delta;

x += xMove;
y += yMove;

absVx -= Math.abs(xMove);
absVy -= Math.abs(yMove);

absVXabsVy存储剩余的绝对距离,并在每次移动后递减。如果它们都低于或等于零,那么我们已经到达目的地,我们将它从数组中删除,并用下一个点重新计算所有内容。

我有两个问题。

  1. 有时角色会跳过一个点,然后他就永远旅行了。这很可能是由于游戏引擎添加到运动中的增量(光滑)并且角色移动得太远,不过我不确定这一点。

  2. 当我单击目标时,这很好用,但我需要的是能够按住鼠标按钮。目前,如果我按住鼠标,角色只会在第一点“静止”。

我有一个解决第二个问题的想法,但我不确定这是一个好主意。它是存储您想从最后一次鼠标单击开始的位置,但在您通过移动到的点之前不会实际计算它。

所以,我希望真正聪明有趣的人可以和我谈谈这个:D

4

1 回答 1

2

关于1,最可能的原因是四舍五入问题;添加这些 xMove / yMove 会引入一个小错误,并且 x 和 y 永远不会真正获得目的地的值,因此算法会继续运行。

解决方法:

1 定义“到达目的地”,以便允许一定程度的错误

2 找出角色到达目的地需要多少“滴答声”,当它“到达”时,将角色位置强制到其目的地(这可以纠正累积的错误)。

Also, I would go back to graphics theory. IIRC, your path moving between points should be equal to Bresenham's line drawing algorithm. For later stages, your character could follow a B-Spline along his path.

于 2011-07-14T22:32:04.830 回答