0

私は2つのクラスを持ってい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) 座標の 2 つのセットを使用し、それらの間の距離を出力します。)

Upgrade のインスタンスが BasicEnemy のインスタンスに近いかどうかを確認するにはどうすればよいですか? ありがとう

4

2 に答える 2

2

最も簡単な方法は、すべての基本的な敵とすべてのアップグレードをループして、任意のペア間の距離が「近い」と考える距離よりも短いかどうかを確認することです。

これは、高度なアルゴリズムを使用することで改善できます。spacial partitioningアカデミックな気分になったらキーワードで検索してみてください。

コードを投稿していただければ、distance喜んで修正いたします。それを見なくても、距離の計算が正しいと確信している場合は、敵とアップグレードに使用される座標が同じ座標空間にあることを確認してください (つまり、両方ともワールド座標です)。

編集:

あなたのコメントに基づいて、静的が何を意味するのか混乱しています。静的変数は、クラスのすべてのインスタンスで共有されます。getX()この場合、あなたの敵は静的なルーチンを持たないはずです。すべての敵には独自の位置が必要であり、単一の位置を共有しているわけではありません。

だから私は提案します:

  1. アップグレードと敵のクラスに、静的でない x 変数と y 変数、および静的でない get/set ルーチンを持たせます。
  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

MediatorUpgrade インスタンスと 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 に答える