java - 游戏编程ai : scaling walls to find a player?

标签 java game-ai

我研究这个人工智能方法有一段时间了。它基本上有一个 int 表示如果一堵墙挡住了敌人通往玩家的路径,敌人可以去的每个方向。这在大多数情况下不起作用。有时敌人会穿过它无法穿过的裂缝。其他时候它会粘在有明显缝隙的墙上。我会附上我的代码,但如果它看起来效率太低或者不是解决它的方法,我不反对完全改变我的方法。我只是想知道这些事情通常是如何完成的,以便我可以以更好(并且有效!)的方式实现它。

我的代码:

    public void update(ArrayList<Wall> walls, Player p){

    findPlayer(p.getX(), p.getY());

    boolean isCollision = false;
    System.out.println(isCollision);
    //if movement straight towards the player is blocked, move along the walls
    for(Wall w : walls){
        if(Helper.isBoundingBoxCollision((int)(x + vectorToPlayer.getDX() * SPEED), (int)(y + vectorToPlayer.getDY() * SPEED), width, height, w.getX(), w.getY(), w.width, w.height)){
            isCollision = true;

            if(Math.abs(vectorToPlayer.getDX()) > Math.abs(vectorToPlayer.getDY())){
                if(vectorToPlayer.getDX() > 0)
                    WALL_COLLISION = 3;
                else
                    WALL_COLLISION = 1;
            }
            else if(Math.abs(vectorToPlayer.getDX()) <     Math.abs(vectorToPlayer.getDY())){
                if(vectorToPlayer.getDY() > 0)
                    WALL_COLLISION = 0;
                else
                    WALL_COLLISION = 2;
            }

        }
    }
    //System.out.println(isCollision);
    //set the direction to the straight on vector, to be reset if there is a collision on this path
    direction = vectorToPlayer;

    if(isCollision){
        //reset the variable, don't mind that what this is named is completely opposite = PIMPIN'
        isCollision = false;

        //scale dem walls son, and see when the path is clear
        for(Wall w : walls){
            if(WALL_COLLISION == 0 && !Helper.isBoundingBoxCollision(x + SPEED, y, width, height, w.getX(), w.getY(), w.width, w.height)){
                WALL_COLLISION = 3;
                isCollision = true;
            }
            else if(WALL_COLLISION == 1 && !Helper.isBoundingBoxCollision(x, y + SPEED, width, height, w.getX(), w.getY(), w.width, w.height)){
                WALL_COLLISION--;
                isCollision = true;
            }
            else if(WALL_COLLISION == 2 && !Helper.isBoundingBoxCollision(x - SPEED, y, width, height, w.getX(), w.getY(), w.width, w.height)){
                WALL_COLLISION--;
                isCollision = true;
            }
            else if(WALL_COLLISION == 3 && !Helper.isBoundingBoxCollision(x, y - SPEED, width, height, w.getX(), w.getY(), w.width, w.height)){
                WALL_COLLISION--;
                isCollision = true;
            }
        }

        //if there is NOT a wall on the designated side, set the vector accoridingly
        if(isCollision){
            if(WALL_COLLISION == 0)
                direction = new NVector(0, 1);
            else if(WALL_COLLISION == 1)
                direction = new NVector(1, 0);
            else if(WALL_COLLISION == 2)
                direction = new NVector(0, -1);
            else if(WALL_COLLISION == 3)
                direction = new NVector(-1, 0);
        }
    }
    x += Math.round(direction.getDX()*SPEED);
    y += Math.round(direction.getDY()*SPEED);
}

最佳答案

看来您目前正在尝试实现的是转向,但这些事情通常的完成方式是 Pathfinding .您决定使用哪个取决于您的应用程序。转向是通过向目标移动但如果有障碍物改变方向来完成的,并且不能保证到达目的地。寻路通常是通过构建“可步行”的航路点或区域图,然后使用 an algorithm such as Dijkstra's 来完成的。遍历它。

关于java - 游戏编程ai : scaling walls to find a player?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13294752/

相关文章:

c++ - 让我的敌人朝我的玩家 C++ 移动

java - java.io.StringReader.<init> 处的线程 "main"java.lang.NullPointerException 中出现异常(来源未知)

java - 连接在一个屏幕上成功下载,但在第二个屏幕上出现错误,代码几乎相同

java - 在我的 printArray 方法中查看数组

ios - SpriteKit 中敌人的 AI

c# - 在四排 (connect4) 游戏中实现和使用 MinMax

java - 如何将 JSON 对象分成几部分?

java - 带有 Intent 的空对象引用

game-ai - 最终幻想战术类游戏的人工智能