我正在尝试创建2D塔防。我在Java中创建它并使用Slick2D库。我正在为敌人使用A *探路者。探路者工作正常,可以在控制台中以正确的方式打印。但是我无法在敌人x和y坐标上实现路径查找器x和y坐标。我希望敌人的图像相应地移动到探路者找到的x和y。 对于探路者;它使用10x10的2D数组。
AStarPathFinder pathfinder = new AStarPathFinder(map, MAX_PATH_LENGTH, false);
Path path = pathfinder.findPath(null, (int)startPosX, (int)startPosY, endPosX, endPosY);
int length = path.getLength();
public enemy() throws SlickException {
}
@Override
public void init(GameContainer gc, StateBasedGame sbg) throws SlickException {
map = new LoadMap();
System.out.println(length);
}
@Override
public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException, InterruptedException {
if (curr_x != endPosX && curr_y != endPosY) {
for (i = 0; i < length; i++) {
Thread.sleep(1000);
curr_x = path.getX(i);
curr_y = path.getY(i);
System.out.println("Move From: " + (int) prev_x + "," + (int) prev_y + ".");
System.out.println("Move To: " + (int) curr_x + "," + (int) curr_y + ".");
if (curr_x - prev_x > 0) { //RIGHT
System.out.println("RIGHT");
startPosX = startPosX + delta*speed/300;
} else if (curr_x - prev_x < 0) { //LEFT
System.out.println("LEFT");
startPosX = startPosX - delta*speed/300;
} else if (curr_y - prev_y > 0) { //DOWN
System.out.println("DOWN");
startPosY = startPosY + delta*speed/300;
} else if (curr_y - prev_y < 0) { //UP
System.out.println("UP");
startPosY = startPosY - delta*speed/300;
}
prev_x = curr_x;
prev_y = curr_y;
System.out.println("------------------");
if (curr_x == endPosX && curr_y == endPosY) {
System.out.println("Done!");
}
}
}
}
@Override
public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException {
e1.draw(startPosX*w,startPosY*w,w,w);
g.drawString("posX "+startPosX,100,100);
g.drawString("posY "+startPosY,100,120);
}
如果有人能把我推向正确的方向,我会很开心。 谢谢。
答案 0 :(得分:0)
让我们根据您的敌人已经发现它是“路径”的假设来看待这个问题。假设它是一个List(ArrayList,如果愿意的话),它包含所有的tile坐标(即正确的“path”)或tile。现在,对于游戏中的每个“更新步骤”或勾选,您希望使用A *来查找敌人的路径,并根据当前敌人的网格位置或平铺来更新它。敌人将拥有一个“目标”牌,这将是当前计算路径数组中的第一个牌。您只需要获取该磁贴的x和y,并在敌人的更新函数中,您将更新其相对于后一个磁贴的x和y。
例如,如果我的敌人在(0,0)并且想要到达(5,5),我会使用A *算法来获取最短路线的瓦片列表。在每次更新时,我会让我的敌人从A *移动到该路径列表中的“目标”或下一个瓦片,直到我们到达后一个瓦片。冲洗并重复。