我正在进行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;
}
所有这一切似乎都发生了,蓝色的圆圈向敌人移动,然后它有时会崩溃......我想拥有它,所以它们以相同的速度移动(例如,恒定速度,不变)并简单地尽量避免靠近敌人,但我显然已经失败了,所以我该怎么做?
答案 0 :(得分:1)
从评论来看,似乎是因为他们越来越接近敌人时蓝圈减慢是无意的。如果您想避免这种情况,则需要将xrate
和yrate
计算为总距离的无量纲比例,而不是使用xd
和yd
的绝对值:< / p>
double xrate = xd / d;
double yrate = yd / d;
另外,我怀疑逆符号中yd
的计算是无意的,因为它会导致盟友沿Y轴靠近敌人,如果不是沿着X轴。