2011-10-14 139 views
0

嘿傢伙我正在做一個2D的Java遊戲,我想弄清楚如何製作一個好的碰撞代碼。我目前使用下面的代碼:Java 2D碰撞?

public void checkCollision() { 
    Rectangle player_rectangle = new Rectangle(player.getX(),player.getY(),32,32); 

    for(Wall wall : walls) { 

     Rectangle wall_rectangle = new Rectangle(wall.getX(), wall.getY(), 32,32); 

     if (player_rectangle.intersects(wall_rectangle)) { 
      Rectangle intersection = (Rectangle) player_rectangle.createIntersection(wall_rectangle); 

      if (player.xspeed > 0) { 
       player.x -= intersection.getWidth(); 
      } 

      if (player.yspeed > 0) { 
       player.y -= intersection.getHeight(); 
      } 

      if (player.xspeed < 0) { 
       player.x += intersection.getWidth(); 
      } 

      if (player.yspeed < 0) { 
       player.y += intersection.getHeight(); 
      } 

      Print(Integer.toString(intersection.width) + ", " + Integer.toString(intersection.height)); 

     } 

    } 

} 

有了這個代碼,它工作正常,如果你按下一個按鍵,但如果按向下和向左例如玩家將在一些隨機的方向飛去。

下面是類型的映射我有一個畫面:

enter image description here

+0

我建議你使用box2d而不是自己做java。 – FUD

+0

[Java平滑2D矩形碰撞?]的可能的重複(http://stackoverflow.com/questions/7753549/java-smooth-2d-rectangle-collision) –

+0

我已經標記爲您的前一個線程的副本。如果它不是重複的(出於某種原因我錯過了),解釋原因很明智。 –

回答

1

你的主要問題是在假設播放器直接運行到牆上。考慮一下牆上的情況(100,100,32,32),玩家在(80,68,32,32)。玩家正向下並向左移動,所以player.xspeed < 0和player.yspeed> 0;說球員的下一個位置是(79,69,32,32)。交點是(100,100,11,1)。

請注意,儘管玩家正在向左(以及向下)移動,但牆壁實際上位於玩家的右側。此線:

if (player.xspeed < 0) { 
    player.x += intersection.getWidth(); 
} 

...導致player.x在突然跳躍中設置爲90。

有一兩件事你可以做的是檢查玩家的左手側載於交集,即

if (player.xspeed < 0 && player.x >= intersection.x) { 
    player.x += intersection.getWidth(); 
} 

顯然,類似的事情需要爲其他方向做了。

+0

那麼我會用你給我的代碼而不是我的代碼?或者用現有的代碼添加它。 –

+0

改爲使用它。 – davmac