Pertanyaan Game programming ai: scaling wall untuk mencari pemain?


Saya telah bekerja pada metode kecerdasan buatan ini untuk sementara waktu. Ini pada dasarnya memiliki int untuk setiap arah musuh bisa pergi jika dinding menghalangi jalannya ke pemain. Ini tidak bekerja dalam banyak kasus. Terkadang musuh akan melalui retakan yang tidak bisa masuk. Lain kali akan terjebak di dinding yang memiliki celah yang jelas di dalamnya. Saya akan melampirkan kode saya, tetapi jika terlihat terlalu tidak efisien atau tidak tepat untuk menyelesaikannya, saya tidak menentang mengubah pendekatan saya sama sekali. Saya hanya ingin tahu bagaimana hal-hal ini dilakukan secara normal, sehingga saya dapat menerapkannya dengan cara yang lebih baik (dan bekerja!).

Kode saya:

    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);
}

7
2017-11-08 17:47


asal


Jawaban:


Tampaknya apa yang Anda coba lakukan saat ini dikenal sebagai Steering, tetapi cara hal-hal ini biasanya dilakukan Menemukan jalan. Yang Anda putuskan untuk digunakan tergantung pada aplikasi Anda. Pengemudian dilakukan dengan bergerak ke arah target Anda, tetapi mengubah arah jika ada hambatan, dan tidak dijamin untuk mencapai tujuannya. Pathfinding biasanya dilakukan dengan membangun grafik waypoints atau area yang "walkable" dan kemudian menggunakan sebuah algoritma seperti Dijkstra's untuk melintasi itu.


3
2017-11-08 17:53