【问题标题】:A* pathfinding in Slick2D: how do I make an enemy move?Slick2D 中的 A* 寻路:如何让敌人移动?
【发布时间】:2018-03-28 15:32:44
【问题描述】:

我正在尝试创建 2D 塔防。我在 Java 中创建它并使用 Slick2D 库。我正在为敌人使用 A* 探路者。探路者工作完美,可以在控制台中以正确的方式打印。但是我无法将探路者 x 和 y 坐标应用于敌人的 x 和 y 坐标。我希望敌人图像相应地移动到探路者找到的 x 和 y。 对于探路者;它使用 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);

    }

如果有人能把我推向正确的方向,我会很高兴。 谢谢你。

【问题讨论】:

  • 敌人的 render() 函数应该是被某人调用的。什么类在渲染屏幕?
  • 不就是把敌人坐标设置为探路者给定的x和y吗?对不起,我想我不明白
  • @alex440 ,敌人类正在主类中使用并且正在正确渲染。那不是问题。问题是e1 的位置。 @MCMastery 这就是我希望 x 和 y 坐标“流畅”的重点。就像现在一样,for 循环运行了 x 次,然后设置敌人图像的位置。
  • 我认为你应该澄清你的问题。似乎您试图在坐标 startPosX、startPosY 处绘制 e1,并且您说坐标是正确的并且渲染它不是问题。那么有什么问题呢?
  • 这个问题不是小事。确定路径是第一步,但是您需要相应地移动实体,这在很大程度上取决于您的游戏和游戏架构。您基本上需要从您确定的实体路径中取出最近的坐标,并将您的实体移向该坐标,直到其均匀。你重复这个直到你的路径是空的。同时,您总是需要更新您的路径,以防地图或实体改变其位置。由于缺少架构信息,很难说出您的确切问题出在哪里

标签: java image move path-finding slick2d


【解决方案1】:

让我们根据你的敌人已经找到它的“路径”的假设来看看这个。假设它是一个包含所有瓦片坐标(即正确的“路径”)或瓦片的列表(ArrayList,如果首选)。现在对于游戏中的每个“更新步骤”或刻度,您想使用 A* 来查找敌人的路径并根据当前敌人的网格位置或图块更新它。敌人将有一个“目标”图块,它将是当前计算路径数组中的第一个图块。您只需获取该图块的 x 和 y,然后在敌人的更新函数中,您将更新其与后一个图块相关的 x 和 y。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2014-04-12
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    相关资源
    最近更新 更多