2013-07-08 24 views
0

我有兩個類,BasicEnemy.javaUpgrade.java。我在每個方法中都有一個getX()方法,它返回類實例的X座標。檢查/比較任何類別實例的方法

Upgrade.java,我希望能夠檢查任何BasicEnemy實例的X座標是否接近任何Upgrade實例的X座標。目前,我有一個行代碼不起作用:(該main.distance方法消耗兩套(X,Y)座標,並輸出它們之間的距離)

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

我如何檢查如果升級的任何實例接近BasicEnemy的任何實例?謝謝

+1

看來你需要第三類負責。 – nachokk

回答

2

最簡單的方法是循環所有基本的敵人,並進行所有升級以查看任何配對之間的距離是否小於您認爲「接近」的距離。

這可以通過使用花哨的算法來改進。如果你覺得學術,嘗試使用關鍵字spacial partitioning進行搜索。

如果您發佈代碼distance我很樂意爲您解決它。如果沒有看到它,如果你確定距離計算是正確的,檢查用於敵人和升級的座標是在同一個座標空間

EDIT(即兩者都是世界座標。):基於

你的意見,你對什麼靜態手段感到困惑。一個靜態變量在每個類的實例中共享。在這種情況下,你的敵人肯定不會有一個靜態的例程。每個敵人都需要他自己的位置,他們不分享獨一無二的位置。

所以我建議:

  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. 
     } 
    } 
} 
+0

距離代碼是: 雙距離(雙x1,雙y1,雙x2,雙y2){ return Math.sqrt((x1-x2)*(x1-x2)+ (Y1-Y2)*(Y1-Y2)); } 但是,這不是問題。問題是試圖從非靜態上下文中引用BasicEnemy.getX(),因爲BasicEnemy.getX()是靜態的。我需要的東西會這樣做: if(main.distance(getX(),getY(),[everyInstanceOfBasicEnemy] .getX(),[everyInstanceOfBasicEnemy] .getY()) – user2562011

+0

對不起......我也敲了回車鍵 – user2562011

+0

這很好,你的計算看起來是正確的我已經根據你對靜態上下文的評論編輯了我的問題 –

0

您可能需要使用一個Mediator,可以將消息發送到升級實例和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

+0

我已經有一個接口,實體,有getX()方法,並且BasicEnemy和Upgrade都實現它。我只是用它來代替'Targetable'嗎? – user2562011

+0

@ user2562011是的,你說得對,你可能想閱讀關於'調解員'模式,它似乎是你在找什麼! – nachokk