假设我想让一个物体在整个游戏中沿着A,B和C点之间的设定路径移动,基于它应该在/朝向哪个点的变量。现在,我可以在完整的A *寻路中进行编程,但这需要花费很多时间,并且需要大量的代码来实现真正不会用于其全部价值的东西。有没有更有效的方法来做到这一点?目前,我唯一的想法是让对象在一个方向上移动一定数量的像素,然后在另一个方向移动另一个,但是对象在一段时间后很容易关闭几个像素。我应该补充说,没有一个点是彼此的视线,所以物体必须围绕墙壁移动。感谢任何帮助,因为我觉得我在这里遗漏了一些非常明显的东西。
我应该澄清一下,墙壁不会改变位置。他们将在整场比赛中保持原状。
答案 0 :(得分:3)
我只做一次完整的A *路径查找并存储结果对象移动。如果任何其他对象可能会改变路径,则可以再次触发路径查找。
答案 1 :(得分:1)
定义点p
的序列,以便:
任意两个连续点p[i]
和p[i + 1]
之间没有任何障碍。
沿着点序列行进将带您从A到B再到C。
换句话说,你正在走A到B到C的路径并将其分成直线段。这些点是固定的,因此您不会因浮点精度而偏离路径。
现在,您可以通过在p
序列中的点到点移动对象来实现目标。要反向移动,请向后迭代p
。
答案 2 :(得分:1)
我假设您的评论“对象在一段时间后关闭几个像素将非常容易”,您的关键问题是如何定期更新对象的位置,以便它遵循一条路径两点。如果您每次都以相同的金额更新它,正如您所说,它不太可能在结束点结束。
最简单的方法是使用一个变量来表示目标到目前为止沿着路径行进的距离。该算法可以非常快速地重新计算正确的位置。
例如:
class Position {
private final int x;
private final int y;
public Position(int x, int y) {
this.x = x;
this.y = y;
}
public static Position interpolatedPosition(Position from, Position to, float progress) {
return new Position(
from.x + Math.round(progress * (to.x - from.x)),
from.y + Math.round(progress * (to.y - from.y)));
}
}
通过将progress
除以呼叫中的距离,您可以相当轻松地将其扩展为允许恒定速度。或者,您可以通过创建包含位置列表和存储进度的类来支持沿路径移动。
class Path {
private final List<Position> positions = new ArrayList<>();
private int currentPosition = 0;
private float progress = 0.0f;
private float speed = 0.1f;
public void addPosition(Position position) {
positions.add(position);
}
public void update() {
progress += speed;
while (progress > 1.0f) {
currentPosition = nextPosition();
progress -= 1.0f;
}
}
public Position getCurrentPosition() {
return Position.interpolatedPosition(positions.get(currentPosition), positions.get(nextPosition()), progress);
}
private int nextPosition() {
return (currentPosition + 1) % positions.size();
}
}
问题的第二部分是如何提前确定障碍物的路径。答案取决于很多因素 - 特别是您希望解决方案的最佳性能以及搜索算法的效率。然而,没有任何简单的快捷方式 - 通用路径查找不是一个简单的区域。根据您的应用程序,最简单的解决方案可能是您自己定义路径,如果您已经知道地图的布局。