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;
}
Таким образом, все, что, похоже, происходит, это синие круги, движущиеся к врагам, а затем они иногда сбой... Я хотел иметь его, чтобы они двигались с той же скоростью (что и в, с постоянной скоростью, а не с переменной) и просто старались избегать приближаясь к врагам, но я явно потерпел неудачу, так как бы я это сделал?
Судя по комментариям, кажется, что результат синих кругов замедляется, поскольку они приближаются к врагам, непреднамеренно. Если вы хотите этого избежать, вам нужно рассчитать xrate
и yrate
как безразмерные пропорции к общему расстоянию вместо использования абсолютных значений xd
и yd
:
double xrate = xd / d;
double yrate = yd / d;
Кроме того, я подозреваю, что вычисление yd
в обратном знаке непреднамеренно, так как это заставит союзников приблизиться к врагам вдоль оси Y, если не вдоль оси X.