Java 使一个物体避开另一个物体

Java 使一个物体避开另一个物体,java,Java,我正在做一个2D游戏,红色圆圈(敌人)将追逐玩家,蓝色圆圈(盟友)。每个类都扩展了名为Entity的类,我在名为Entities的ArrayList中创建了所有实体。我想让蓝圈尽可能避开敌人。。。以下是我尝试过的一些代码,我认为这些代码会起作用: public void runAwayFrom(Entity e){ double xpos = e.getX(); double ypos = e.getY(); double xd = xpos - x; doubl

我正在做一个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;
}
公共双getDistance(实体目标){
返回Math.hypot(target.getX()-getX(),target.getY()-getY());
}
公共实体getNearestEnemy(){
双最近距离=50000;
实体nearestent=null;
for(实体e:w.getObjectsOfClassInWorld(敌方类)){
双距离=距离(e);
if(距离<最近距离){
最近距离=距离;
最近的=e;
}
}
返回最近的地方;
}

所以所有的事情似乎都是蓝色圆圈向敌人移动,然后它有时会崩溃。。。我想让他们以相同的速度移动(比如,恒定的速度,而不是可变的速度),并尽量避免靠近敌人,但我显然失败了,所以我该怎么做?

从评论判断,蓝圈在靠近敌人时减速似乎是无意的。如果要避免这种情况,您需要将
xrate
yrate
计算为总距离的无量纲比例,而不是使用
xd
yd
的绝对值:

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

另外,我怀疑反号中的
yd
的计算是无意的,因为它会导致盟军沿着Y轴(如果不是X轴)向敌人靠近。

你有没有试过用一个敌人来计算?它是如何工作的?它只在一个敌人身上工作得更好,但是蓝圈的家伙在敌人靠近时会减速。有什么理由用相反的符号计算
xd
yd
吗?听起来不错,因为在
runAwayFrom
中,要从
x
y
中减去的值取决于它运行的实体的距离,所以您的
yd
xd
变量。如果你想让你的蓝色圆圈以恒定的速度跑开,那么它跑出的实体的位置只会影响运动的方向,而不会影响它的距离