我目前有一个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);
absVX
和absVy
存储剩下的绝对距离,并在每次移动后递减。如果它们都低于或等于零,那么我们已到达目的地,我们将其从数组中删除,并使用下一个点重新计算所有内容。
我有两个问题。
有时候角色跳过一个点然后他就会永远地旅行。这很可能是由于游戏引擎增加了动作(光滑)并且角色移动得太远,但我不确定这一点。
单击目的地时,此功能正常,但我需要的是能够按住鼠标按钮。目前,如果我按住鼠标,角色只会在第一点“静止不动”。
我有一个解决第二个问题的想法,但我不确定它是一个好问题。它是存储你想要从最后一次鼠标点击去的位置,但实际上并没有计算它,直到你已经通过了你要移动的点。
所以,我希望有人真正聪明,有趣,可以和我谈谈这件事:D
答案 0 :(得分:2)
大约1,最可能的原因是四舍五入问题;添加这些xMove / yMove会引入一个小错误,而x和y从未真正获得目标值,因此算法会继续运行。
解决方法:
1定义“到达目的地”,以便允许一定程度的错误
2找出角色到达目的地需要多少“滴答”,当它“到达”时,强制将角色位置移动到目的地(这样可以纠正累积的错误)。
另外,我会回到图形理论。 IIRC,你在点之间移动的路径应该等于Bresenham的线绘制算法。对于后期阶段,你的角色可以沿着他的路径遵循B样条。