【问题标题】:Following a path in LibGdx遵循 LibGdx 中的路径
【发布时间】:2016-04-07 09:27:01
【问题描述】:

我有在 libGdx 中输出路径的代码:

public Target(Vector2 villager, Vector2 target){
      pathFinder = new IndexedAStarPathFinder<Node>(LevelManager.graph, false);

        int startX = (int) villager.x;
        int startY = (int) villager.y;

        int endX = (int) target.x;
        int endY = (int) target.y;

        Node startNode = LevelManager.graph.getNodeByXY(startX, startY);
        Node endNode = LevelManager.graph.getNodeByXY(endX, endY);

        pathFinder.searchNodePath(startNode, endNode, new HeuristicImp(), resultPath);
        Gdx.app.log("Path", ""+ resultPath.getCount());

  }

我的问题是,有没有办法在不使用转向行为的情况下使用 resultPath 来实现运动?一些容易掌握和实施的东西?我说的是根据输出路径移动精灵的 x 和 y。帮助将不胜感激!

【问题讨论】:

    标签: java libgdx artificial-intelligence path-finding


    【解决方案1】:

    您只需将您的精灵从currentPosition 移动到nextPosition - 您可以将这些值存储在Vector2 类实例中。

    您将在 render() 方法中更新 sprite 的位置,例如

        Vector2 currentPosition, nextPosition;
        final float SPEED; //how fast sprite will be moved
    
        //render()
        Vector2 step = nextPosition.cpy().sub(currentPosition).nor().scl(SPEED);
        sprite.setPosition(sprite.getX() + step.x, sprite.getY() + step.y);
    

    那么你必须检查你的精灵是否达到了 nextPosition(或者说它的距离是否足够小),如果是,你必须设置新的nextPosition

        if(nextPosition.cpy().sub(sprite.getX(), sprite.getY()).len() < SOME_LENGTH) {
            nextPosition = getNextPosition();
    

    如果没有新的nextPosition 获取,那么新的nextPosition 值应该只是精灵的位置(以保持它就位)

    【讨论】:

    • resultPath 是从哪里来的?您是否在添加连接时循环?或者你是否以某种方式解释了整个路径?我不明白路径如何转换为 nextPosition。
    • 作为nextPosition,您应该只保留路径的下一个节点 - 整个路径应该保存在另一个变量中
    • 关于 Node 到 Vector2 的转换发生在哪里的任何提示?
    • 节点必须有 xy 坐标保存在某个地方,所以您只需要获取节点的位置 - 这就是您的向量