Java 使一个物体避开另一个物体
我正在做一个2D游戏,红色圆圈(敌人)将追逐玩家,蓝色圆圈(盟友)。每个类都扩展了名为Entity的类,我在名为Entities的ArrayList中创建了所有实体。我想让蓝圈尽可能避开敌人。。。以下是我尝试过的一些代码,我认为这些代码会起作用: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
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
变量。如果你想让你的蓝色圆圈以恒定的速度跑开,那么它跑出的实体的位置只会影响运动的方向,而不会影响它的距离