2011-04-23 183 views
1

我正在製作一款2D小遊戲,並且我有一名玩家。物體碰撞系統?

編輯:

這就是我現在所擁有的:

 int oldX = player.x; 
    int oldY = player.y; 

    int newX = oldX - player.getSpeedX(); 
    int newY = oldY - player.getSpeedY(); 

    if(player.getBounds().intersects(brush1.getBounds())){ 
     player.x = newX; 
     player.y = newY; 
    }else{ 
     player.x = oldX; 
     player.y = oldY; 
    } 

但是,它是作用很古怪,它的變化速度,當我從一個側面去,等

+0

[環線衝突檢測(http://stackoverflow.com/questions/1073336/circle-line-collision-detection) – schnaader 2011-04-23 12:25:33

+0

更多關於這個答案可能重複,也許? – Stan 2011-04-25 00:10:02

回答

1

對於檢查線段和圓的交點的公式和代碼,看看這個SO answer

其餘的代碼應該很清楚,在你做出移動之前,檢查是否發生了碰撞,如果碰到,不要移動。

根據您喜歡的行爲,您也可以儘可能靠近牆壁移動,然後平行移動,讓圓形沿牆壁「滑動」。這可以通過將運動矢量投影到與牆壁具有相同方向的線上來完成。

編輯:

代碼使用Dot函數,計算兩個向量的dot product:如何使用代碼的答案,檢查碰撞的一些意見。你可以創建一個Vector類(一個很好的練習,它對於這樣的項目很有用),或者直接使用formulas here來計算點積。

一個向量類將使一些代碼更容易閱讀,但是您也可以直接在浮動上操作。例如,讓我們看一下計算d(方向矢量的射線)和f(從中心球到射線開始的矢量),如答案開始處所述。用向量類,公式中使用有這將是一樣容易:

// L, E, C, d and f are of some vector type 
d = L - E; 
f = E - C; 

沒有一個向量類,你必須對所有變量的單獨的x/y座標,腹脹碼了一點,但這樣做只是一樣的:

// Twice as much variables, but all of them are usual floats. 
dx = Lx - Ex; 
dy = Ly - Ey; 
fx = Ex - Cx; 
fy = Ey - Cy; 
+0

嗯,我還不是一個好的編碼器,我真的不明白這一點。這真的很難嗎?或者? – Stan 2011-04-23 12:38:30

+0

最難的是涉及的數學。在這種情況下,我建議你應該從答案中複製/粘貼代碼並將其擴展,以便它適用於你。我會編輯我的答案,並留下一些其他意見。 – schnaader 2011-04-23 12:46:23

+0

好吧,如果我將橢圓形編輯成長方形,會更容易嗎,還是會一樣? – Stan 2011-04-23 12:48:57

0

我認爲你的代碼片段有一些錯誤。建議的修復:

int oldX = player.x; 
int oldY = player.y; 

// *add* speed to old pos to get new pos 
int newX = oldX + player.getSpeedX(); 
int newY = oldY + player.getSpeedY(); 

if(player.getBounds().intersects(brush1.getBounds())){ 
    // Collision! Keep old position. 
    // Reverse speed (just a suggestion). 
    player.setSpeedX(-player.getSpeedX()); 
    player.setSpeedY(-player.getSpeedY()); 
}else{ 
    // No collision. Set position to *new* pos, not old pos. 
    player.x = newX; 
    player.y = newY; 
} 
+0

它仍然會通過所有的對象,不知何故。 – Stan 2011-04-25 11:38:32