2013-03-09 60 views
0

我在java中做了一個簡單的遊戲,我有很多測試兩個對象是否碰撞的方法。對象包括男人,敵人,箭頭,牆,硬幣等。我有一大堆的這些算不算對每一種類型可能發生碰撞的方法,他們是這樣的:減少Java遊戲中碰撞方法的數量

public boolean collide(Arrow a, Enemy b) 
    { 
     Rectangle a1 = a.getBounds(); 
     Rectangle b1 = b.getBounds(); 
     if(a1.intersects(b1)) return true; 
     else return false; 
    } 

有沒有去創建一個通用的方法是什麼?我嘗試使用對象a和對象b作爲參數,但編譯器比較它無法找到對象的getBounds()。

+1

使用這些類的通用接口而不是Object。該接口必須包含一個方法'Rectangle getBounds();'這些類必須實現它。另外,你可以用'return a1.intersects(b1);' – jlordo 2013-03-09 16:09:19

+0

替換最後兩行,參見[本答案](http://stackoverflow.com/a/14575043/418556) '實例。 – 2013-03-09 16:23:43

回答

3

你可以這樣做:

public boolean collide(HasBounds a, HasBounds b){... 

隨着接口:

public interface HasBounds{ 
    Rectangle getBounds(); 
} 

,你應該在你的對象ArrowEnemy等定義...(你可能已經有一個對象的層次結構適合於此)。

+0

更簡單:'公開布爾碰撞(HasBounds a,HasBounds b){' – jlordo 2013-03-09 16:13:43

+0

確實,我編輯我的答案相應 – benzonico 2013-03-09 16:15:31

+0

謝謝,這完美的作品! – Joe 2013-03-10 15:14:03

-1

只需用抽象類GameObject與方法:Rectangle2D getShape()。這種方法可能看起來像:

abstract class GameObject { 
    private Image image; 

    GameObject(String path) { 
     try { 
      image = ImageIO.read(new File(path)); 
     } catch (IOException ex) {} 
    } 

    Rectangle2D getShape() { 
     return new Rectangle2D.Float(0, 0, (int)image.getWidth(), (int)image.getHeight()); 
    } 
} 

播放器,敵人,箭,牆會被

+0

這是如何減少'collide()'方法的數量? – jlordo 2013-03-09 16:17:51

+0

現在,您不需要爲不同的碰撞修改過載collide()方法。相反,有一個方法的寬度參數:(GameObject collid1,GameObject collid2) – 2013-03-09 16:19:10

+0

這應該是答案的一部分。構造函數和'getShape()'方法與OP的問題沒有任何關係。 – jlordo 2013-03-09 16:20:25

1

你覺得這是什麼遊戲對象類的子類..

public boolean collide(Rectangle a1, Rectangle b1) 
{ 
     return a1.intersects(b1); 
} 

,或者可以創建接口

public interface CanCollide { 
    Rectangle getBounds(); 
} 

,並在該方法中使用它...

public boolean collide(CanCollide a, CanCollide b) 
{ 
    Rectangle a1 = a.getBounds(); 
    Rectangle b1 = b.getBounds(); 
    if(a1.intersects(b1)) return true; 
    else return false; 
} 

希望你覺得它有用。

謝謝!

@leo。