Slick2D中的A *寻路:我如何让敌人移动?

时间:2018-03-28 15:32:45

标签: java image move slick2d pathfinder

我正在尝试创建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);

    }

如果有人能把我推向正确的方向,我会很开心。 谢谢。

1 个答案:

答案 0 :(得分:0)

让我们根据您的敌人已经发现它是“路径”的假设来看待这个问题。假设它是一个List(ArrayList,如果愿意的话),它包含所有的tile坐标(即正确的“path”)或tile。现在,对于游戏中的每个“更新步骤”或勾选,您希望使用A *来查找敌人的路径,并根据当前敌人的网格位置或平铺来更新它。敌人将拥有一个“目标”牌,这将是当前计算路径数组中的第一个牌。您只需要获取该磁贴的x和y,并在敌人的更新函数中,您将更新其相对于后一个磁贴的x和y。

例如,如果我的敌人在(0,0)并且想要到达(5,5),我会使用A *算法来获取最短路线的瓦片列表。在每次更新时,我会让我的敌人从A *移动到该路径列表中的“目标”或下一个瓦片,直到我们到达后一个瓦片。冲洗并重复。