2016-09-30 49 views
3

我一直在試着用一個小小的「遊戲」來學習Java,這個遊戲只是試圖讓球跳起來。我有3個班級(JumpingBall3,BallSprite3,& Floor),並且已經實現了某種程度的重力,一直持續的跳躍,並且擊中地面以防止球無限落下。有了最後一點,我發現了未來發展的潛在問題。現在,我有兩個樓層的JumpingBall3創建(「floor1」 &「平臺」),我使用下面的代碼檢測BallSpite3內碰撞:Java:檢查多個對象的矩形碰撞

public boolean collision() 
{ 

    if (game.floor1.getBounds().intersects(getBounds()) || game.platform.getBounds().intersects(getBounds()))  { 
     onFloor = true; 
    } 
    else 
    { 
     onFloor = false; 
    } 

    return onFloor; 
} 

如果我要繼續添加更多的地板或平臺,「如果「情況很快就會在長度上失控。有沒有辦法創建一個循環遍歷在我的JumpingBall3類中創建的所有可見Floor對象的方法?

我已經在網上發佈了完整的代碼here,包括在這篇文章中似乎有點冗長。

回答

2

最簡單的方法是將所有要檢查的對象保存在Collection中,例如List,然後遍歷此List

因此,舉例來說,這裏是不錯的選擇將是使用的Floor的集合,其上我們反覆檢查,如果我們有與他們的一個碰撞。

public boolean collision() { 
    boolean onFloor = false; 
    Rectangle rectangle = getBounds(); 
    for (Floor floor : floors) { 
     if (floor.getBounds().intersects(rectangle)) { 
      onFloor = true; 
      break; 
     } 
    } 
    return onFloor; 
} 

假設你使用的Java 8,你可以依靠Stream API做,因爲下一個同樣的事情:

public boolean collision() { 
    Rectangle rectangle = getBounds(); 
    return floors.stream().map(Floor::getBounds).anyMatch(rectangle::intersects); 
} 
+0

有趣,謝謝!我會做一些閱讀收藏和列表,因爲它們聽起來完全像我試圖達到的和我目前的知識水平。同樣感謝這個小例子,這真的有助於證明你正在解釋什麼。我還會研究Stream API。 – Jonathan

1

用所有對象創建一個列表。然後使用循環遍歷所有要檢測的對象(除了進行檢測的對象)

1

一個平易近人的解決這個問題是讓你的「遊戲世界」包含一個實體列表(實體可以是球或牆或其他任何遊戲對象),並且有一些機制可以檢測哪些實體靠近哪些其他實體。這最終會調用某種類型的entity.checkCollision(neighborEntity)方法。

你仍然需要有不同的行爲與不同的實體碰撞。您可以通過讓基類Entity具有可以關閉或打開的一些常用屬性或存儲可直接應用於碰撞實體的行爲來實現此目的。

// within some game loop, check for collisions 
for (Entity entity : collidableEntities) 
{ 
    ball.checkCollision(entity); 
} 

你的類可以像這樣有程序的行爲。

public Entity 
{ 
    public void applyCollisionBehaviorTo(Ball ball) { // Override to do something} 

    public void onCollision() { // Override to do something } 

    public collidesWith(Entity neighbor) { // your collision math } 

    public void checkCollision(Entity neighbor) 
    { 
     if (collidesWith(neighbor)) 
     { 
      onCollision() 
     } 
    } 
} 

public Wall extends Entity 
{ 
    @Overide 
    public void applyCollisionBehaviorTo(Ball ball) 
    { 
     ball.reverseDirection(); 
    } 
} 

public Ball extends Entity 
{ 
    @Overide 
    public void onCollision(Entity collidingEntity) 
    { 
     collidingEntity.applyCollisionBehaviorTo(this); 
    } 
} 
+0

感謝您的回答!這絕對看起來像我將來會回顧的東西。雖然對於我來說這件事看起來有點高級,但實體,常見行爲以及處理碰撞行爲的多種方法的概念似乎是我正在繼續開發這個項目的複雜性時所遇到的事情。 :) – Jonathan

+0

@Jonathan沒問題。像應用程序一樣製作遊戲是一件困難的事情,因爲存在很多狀態,時間問題和空間問題。最好的方法就是爲所有事物建立一個完全理解的小塊,然後慢慢地將它們放在一起。 – NESPowerGlove