0

我有两个班,BasicEnemy.javaUpgrade.java。我每个都有一个 getX() 方法,它返回类实例的 X 坐标。

Upgrade.java,我希望能够检查任何 BasicEnemy 实例的 X 坐标是否靠近任何 Upgrade 实例的 X 坐标。目前,我有一行代码不起作用:

if(main.distance(getX(), getY(), BasicEnemy.getX(), BasicEnemy.getY()) < 15)

(该main.distance方法消耗两组(X,Y)坐标并输出它们之间的距离。)

如何检查 Upgrade 的任何实例是否接近 BasicEnemy 的任何实例?谢谢

4

2 回答 2

2

最简单的方法是遍历所有基本敌人和所有升级,以查看任何一对之间的距离是否小于您认为“接近”的距离。

这可以通过使用花哨的算法来改进。spacial partitioning如果您感觉学术性很强,请尝试使用关键字进行搜索。

如果您将代码发布在distance我很乐意为您修复它。没有看到,如果你确定距离计算是正确的,检查敌人和升级使用的坐标是否在同一个坐标空间中(即两者都是世界坐标)

编辑:

根据您的评论,您对静态的含义感到困惑。静态变量在类的每个实例之间共享。在这种情况下,你的敌人肯定不应该有一个静态的getX()例程。每个敌人都需要自己的阵地,他们不共享一个单一的阵地。

所以我建议:

  1. 使您的升级和敌人类具有非静态 x 和 y 变量,以及非静态获取/设置例程。
  2. 将所有敌人实例存储在数据结构中,例如列表。
  3. 将所有升级实例存储在数据结构中,例如列表。

然后像这样枚举两者:

for(int i=0;i<enemies.size();i++){
    Enemy enemy = enemies.get(i);
    for(int j=0;j<upgrades.size();j++){
        Upgrade upgrade = upgrades.get(j);
        if(main.distance(enemy.getX(),upgrade.getX(),enemy.getY(),upgrade.getY())<15){
            //enemy is close to upgrade.
        }
    }
}
于 2013-07-08T19:21:52.060 回答
0

您可能想要使用一个Mediator可以向 Upgrade 实例和 BasicEnemy 实例发送消息的类,但为此您必须使它们成为同事,因此创建一个通用接口,例如 .

public interface Targetable{

int getX();

}

现在在你的课上

public BasicEnemy implements Targetable public Upgrade implements Targetable

和一个中介类

  public  class TargetMediator  {
    Set<Upgrade> upgradeables;


    public Targeteable isSomeOneCloseToMe (Targeteable basicEnemy){
                //code here
    }

    }

您可能想了解此设计模式:Mediator

于 2013-07-08T19:25:47.313 回答