Заставьте один объект избегать другого объекта

1

Im делает 2D-игру, в которой красные круги (враги) будут преследовать игрока и синие круги (союзники). Каждый из этих классов расширяет мой класс под названием Entity, и у меня есть все Entities, которые я создаю в объектах ArrayList. Я хотел, чтобы синие круги избегали врагов, где это возможно... Вот какой код, который я пробовал, что я думал, будет работать:

public void runAwayFrom(Entity e){
    double xpos = e.getX();
    double ypos = e.getY();
    double xd = xpos - x;
    double yd = y - ypos;
    double d = Math.sqrt((Math.pow(xd,2))+(Math.pow(yd,2)));

    double xrate = xd/400;
    double yrate = yd/400;
    x -= xrate*speed;
    y -= yrate*speed;
}

Этот метод вызывается в моем методе тика:

public void tick(int i){
    if(isControlled()){

    }else{
        Enemy e = (Enemy)getNearestEnemy();
        runAwayFrom(e);
    }
}

И вот метод getNearestEnemy просто:

public double getDistance(Entity target) {
   return Math.hypot(target.getX() - getX(), target.getY() - getY());
}

public Entity getNearestEnemy() {
    double nearestdist = 50000;
    Entity nearestent = null;
    for(Entity e : w.getObjectsOfClassInWorld(Enemy.class)){
        double dist = getDistance(e);
        if(dist < nearestdist){
            nearestdist = dist;
            nearestent = e;
        }
    }
    return nearestent;
}

Таким образом, все, что, похоже, происходит, это синие круги, движущиеся к врагам, а затем они иногда сбой... Я хотел иметь его, чтобы они двигались с той же скоростью (что и в, с постоянной скоростью, а не с переменной) и просто старались избегать приближаясь к врагам, но я явно потерпел неудачу, так как бы я это сделал?

  • 1
    Вы пытались запустить это с одним врагом? Как это ведет себя?
  • 0
    Лучше работает только с одним врагом, но парень с синим кругом замедляется по мере приближения врага
Показать ещё 3 комментария
Теги:

1 ответ

1

Судя по комментариям, кажется, что результат синих кругов замедляется, поскольку они приближаются к врагам, непреднамеренно. Если вы хотите этого избежать, вам нужно рассчитать xrate и yrate как безразмерные пропорции к общему расстоянию вместо использования абсолютных значений xd и yd:

double xrate = xd / d;
double yrate = yd / d;

Кроме того, я подозреваю, что вычисление yd в обратном знаке непреднамеренно, так как это заставит союзников приблизиться к врагам вдоль оси Y, если не вдоль оси X.

  • 0
    спасибо твое право
  • 0
    Это также увеличило частоту кадров на 1000 ???

Ещё вопросы

Сообщество Overcoder
Наверх
Меню