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