使一个对象避免另一个对象

时间:2015-03-23 21:48:16

标签: java

我正在进行2D游戏,其中红色圆圈(敌人)将追逐玩家和蓝色圆圈(盟友)。这些类中的每一个都扩展了我的类Entity,我拥有在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;
}

这个方法在我的tick方法中调用,如下所示:

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 :(得分:1)

从评论来看,似乎是因为他们越来越接近敌人时蓝圈减慢是无意的。如果您想避免这种情况,则需要将xrateyrate计算为总距离的无量纲比例,而不是使用xdyd的绝对值:< / p>

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

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