我正在尝试创建一个2D塔防御。我正在Java中创建它,并使用Slick2D库。我正在为敌人使用A*探路者。探路者可以完美地工作,并且可以以正确的方式在控制台中打印。但是我在实现敌人X和Y坐标的路径X和Y坐标方面遇到了麻烦。我希望敌人的图像相应地移动到探路者找到的X和Y。对于探路者;它使用的2D阵列为10x10。
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);
}
如果有人可以向我推动正确的方向,我会很高兴。谢谢。
让我们根据敌人已经发现它的"路径"的假设来看看。假设它是包含所有瓷砖坐标(即正确的"路径"(或瓷砖的列表(ArrayList,如果需要的话(。现在,对于游戏中的每个"更新步骤"或勾选,您想使用A*来找到敌人的路径,并根据当前敌人的网格位置或瓷砖进行更新。敌人将有一个"目标"瓷砖,这将是当前计算路径阵列中的第一个瓷砖。您只需在敌人的更新功能中占据x和y,就可以更新其x和y。
例如,如果我的敌人在(0,0(,并且想到达(5,5(,我将使用A*算法来获取最短路线的瓷砖列表。在每次更新中,我将使敌人从A*中移动到该路径列表中的"目标"或下一个瓷砖,直到我们到达后一个瓷砖。冲洗并重复。