поиск пути (Android Studio + libgdx) - PullRequest
0 голосов
/ 15 ноября 2018

Итак, моя проблема в том, что я создал пошаговую игру для двух игроков с Android Studio и пакетом AI libgdx, и теперь я могу перемещать своих игроков, единственная проблема, которая меня раздражает, это то, что враг, который играету меня есть target, это ближайший игрок, и мне удается переместить его к цели, но когда он сталкивается с препятствием, он не обходит его, я ищу в интернете алгоритмы поиска пути, но я могу 't применить их к моей игре

Там код класса врага

public class Enemy extends Entities {


private static final Logger log = new Logger(Enemy.class.getSimpleName(), Logger.DEBUG);

public Player target;
public float movement = GameConfig.ENEMY_MOVEMENTS;


//Obligatoire pour le JSON
public Enemy() {
}

public Enemy(float x, float y, float width, float height,Color color) {
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
    this.color = color;
    target= new Player();
}

/**
 * Cette méthode vérifie si l'ennemie est en collision avec soit un obstacle(Murs, caisses) ou un joueur
 */
public boolean isCollidingObstacle(float x, float y, Array<ObstacleBase> obstacles, Array<Enemy> enemies, Player player1, Player player2, int index) {

    for (ObstacleBase obstacle : obstacles) {
        if (x >= obstacle.getBounds().getX() && y >= obstacle.getBounds().getY()) {
            if (x <= obstacle.getBounds().getWidth() + obstacle.getBounds().getX() - 1 && y <= obstacle.getBounds().getHeight() + obstacle.getBounds().getY() - 1) {
                //log.debug("Un obstacle se trouve en " + obstacle.getBounds().getX() + " " + obstacle.getBounds().getY());
                return true;
            }
        }
    }

    int i = 0;
    for (Enemy enemy : enemies) {

        if (i == index) {

        } else {
            if (x == enemy.getX() && y == enemy.getY()) {
                return true;
            }
        }
        i++;
    }
    if (x == player1.getX() && y == player1.getY()) {
        return true;
    }
    if (x == player2.getX() && y == player2.getY()) {
        return true;
    }
    return false;
}

/**
 * Cette méthode permet de vérifier si l'ennemie se trouve à côté de la cible
 * @return
 */
public boolean nextToTarget(){
    if (x == target.getX()+1 && y == target.getY()||x == target.getX()+1 && y == target.getY()||
            x == target.getX() && y == target.getY()-1||x == target.getX() && y == target.getY()+1) {
        return true;
    }
    return false;
}

/**
 * Cette méthode permet de savoir quel joueur est le plus proche et de le mettre en target pour l'ennemie
 *
 * @param player1
 * @param player2
 */
public void nearPlayer(Player player1, Player player2) {
    float diffXP1 = (this.getX() - player1.getX());
    float diffXP2 = (this.getX() - player2.getX());
    float diffYP1 = (this.getY() - player1.getY());
    float diffYP2 = (this.getY() - player2.getY());

    if (diffXP1 < 0) {
        diffXP1 *= -1;
    }
    if (diffXP2 < 0) {
        diffXP2 *= -1;
    }
    if (diffYP1 < 0) {
        diffYP1 *= -1;
    }
    if (diffYP2 < 0) {
        diffYP2 *= -1;
    }
    float diffP1=diffYP1-diffXP1;
    float diffP2=diffYP2-diffXP2;

    if(diffP1<0){
        diffP1 *= -1;
    }
    if(diffP2<0){
        diffP2 *= -1;
    }

    if(diffP1<diffP2){
        target.setX(player1.getX());
        target.setY(player1.getY());
    }else{
        target.setX(player2.getX());
        target.setY(player2.getY());
    }
}


public void update(final Array<ObstacleBase> obstacles, final Array<Enemy> enemies, Player player1, Player player2, int index) {
    move(obstacles, enemies, player1, player2, index);
    nearPlayer(player1,player2);
}


public void move(final Array<ObstacleBase> obstacles, final Array<Enemy> enemies, Player player1, Player player2, int index) {
    if (nextToTarget()) {
        endTurn();
    }else if(!(movements_done==0)&& movement==movements_done){
        endTurn();
    } else if (movement > movements_done || movements_done == 0) {
        if (target.getX() > this.getX()) {
            if (!(isCollidingObstacle(getX() + 1, getY(), obstacles, enemies, player1, player2, index))) {
                movements_done += 1;
                setX(getX() + 1);
            }
        } else if (target.getX() < this.getX()) {
            if (!(isCollidingObstacle(getX() - 1, getY(), obstacles, enemies, player1, player2, index))) {
                movements_done += 1;
                setX(getX() - 1);
            }
        }

        if (target.getY() > this.getY()) {
            if (!(isCollidingObstacle(getX(), getY() + 1, obstacles, enemies, player1, player2, index))) {
                movements_done += 1;
                setY(getY() + 1);
            }
        } else if (target.getY() < this.getY()) {
            if (!(isCollidingObstacle(getX(), getY() - 1, obstacles, enemies, player1, player2, index))) {
                movements_done += 1;
                setY(getY() - 1);
            }
        }

    }
}
}

Я хочу уточнить, что я также искал в документации по libgdx AI для поиска пути, но даже тогда яне понимаю, как применить это к игре.

Для большей точности или кода, я в вашем распоряжении.

...