a* slick2d中的探路:我如何使敌人移动



我正在尝试创建一个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*中移动到该路径列表中的"目标"或下一个瓷砖,直到我们到达后一个瓷砖。冲洗并重复。

最新更新