我有两个班级,BasicEnemy.java
和Upgrade.java
。我在每个方法中都有一个getX()方法,它返回类实例的X坐标。
从 Upgrade.java ,我希望能够检查BasicEnemy的任何实例的X坐标是否接近任何Upgrade实例的X坐标。目前,我有一行不起作用的代码:
if(main.distance(getX(), getY(), BasicEnemy.getX(), BasicEnemy.getY()) < 15)
(main.distance
方法使用两组(X,Y)坐标并输出它们之间的距离。)
如何查看任何升级实例是否接近BasicEnemy的任何实例?感谢
答案 0 :(得分:2)
最简单的方法是循环遍历所有基本敌人,并进行所有升级以查看任何一对之间的距离是否小于您认为“近距离”的距离。
这可以通过使用花哨的算法来改进。如果您有学术感,请尝试使用关键字spacial partitioning
进行搜索。
如果您在distance
中发布代码,我很乐意为您解决此问题。没有看到它,如果你确定距离计算是正确的,检查用于敌人和升级的坐标是否在同一坐标空间(即两者都是世界坐标)
编辑:
根据您的评论,您对静态意味着什么感到困惑。静态变量在每个类的实例之间共享。在这种情况下,你的敌人肯定不会有静态getX()
例程。每个敌人都需要自己的位置,他们没有共同的位置。
所以我建议:
然后像这样枚举两者:
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.
}
}
}
答案 1 :(得分:0)
您可能想要使用Mediator
,这是一个可以向升级实例和BasicEnemy实例发送消息的类,但为此您必须使它们成为同事,因此创建一个通用接口,如。
public interface Targetable{
int getX();
}
现在在你的班级
public BasicEnemy implements Targetable
public Upgrade implements Targetable
和Mediator类
public class TargetMediator {
Set<Upgrade> upgradeables;
public Targeteable isSomeOneCloseToMe (Targeteable basicEnemy){
//code here
}
}
您可能需要了解此设计模式:Mediator