假设我想让一个对象在整个游戏中沿着A、B和C点之间的一条设定路径反复移动,这取决于它应该在/朝哪个点移动的变量。现在,我可以编写一个完整的路径查找程序,但是这需要很多时间,并且需要很多代码来完成一些不能完全使用的东西有没有更有效的方法来做到这一点目前,我唯一的想法是让对象在一个方向上移动一组像素,然后是另一个,然后是另一个,但对于对象来说,很容易在一段时间后去掉几个像素我要补充的是,没有一个点是在视线范围内的另一个,所以物体将不得不在墙壁周围移动任何帮助都是值得感谢的,因为我觉得我错过了一些非常明显的东西。
我应该澄清,墙壁不会改变位置他们将在整场比赛中留在原地。
最佳答案
我从你的评论中推测“一段时间后物体会很容易去掉几个像素”,你的关键问题是如何定期更新物体的位置,使其沿着两点之间的路径移动如果你只是每次更新相同的数量,那么,正如你所说,它不太可能结束在终点。
最简单的方法是使用一个变量来表示对象已经沿着路径走了多远。该算法可以很快地重新计算出正确的位置。
例如:
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();
}
}
你问题的第二部分是如何围绕一系列障碍提前确定这条道路这个问题的答案取决于很多因素——特别是你希望解决方案的最优程度以及搜索算法的效率但是,没有任何简单的快捷方式-通用路径查找不是一个简单的区域。根据应用程序的不同,如果您已经知道地图的布局,最简单的解决方案可能是自己定义路径。