2012-12-12 179 views
0

所以基本上,我正在做我的第一個xna遊戲,它是一個打磚塊遊戲。我的球現在是一個旋轉的正方形。與旋轉矩形的碰撞

不幸的是,無法正確檢測xna中旋轉矩形的碰撞。

我發現約標量的事情,但我只在計算機科學在大學,所以我不知道這些大數學做...

誰能告訴我在檢測到這些類型的碰撞的正確方法嗎?或者至少能夠以正確的方式獲得一個新的矩形,以便我可以檢測到這個碰撞?

編輯 我只是想在靜止的廣場上製作我的旋轉廣場,並測試與外部廣場的碰撞會是可行的嗎?

+1

修改我以前的評論.... http://www.gamedev.net/page/resources/_/technical/game-programming/2d-rotated-rectangle-碰撞r2604 – Terrance

+2

類似的問題http://stackoverflow.com/questions/641219/how-can-i-perform-collision-detection-on-rotated-rectangles?rq=1 – Terrance

+0

這是很好的兩個矩形之間的碰撞,但讓說,我只是想保持屏幕上的矩形... – AntoineLev

回答

1

如果您想檢測方形球與外部矩形的碰撞,您需要知道球的四個角的座標。然後簡單地將這些點與外部矩形進行比較。如果s是矩形邊的長度。角落可以這樣計算:

double h = 0.707106781 * s; // Half diagonal 
double angle = rotation_angle + 0.25 * Math.PI; // 0.25 * Math.PI = 45 degrees 
               // inclination of the diagonal. 
double x = h * Math.Cos(angle); 
double y = h * Math.Sin(angle); 

// The four points are 
p1x = +x + squareCenterX; 
p1y = +y + squareCenterY; 

p2x = -y + squareCenterX; 
p2y = +x + squareCenterY; 

p3x = -x + squareCenterX; 
p3y = -y + squareCenterY; 

p4x = +y + squareCenterX; 
p4y = -x + squareCenterY; 
0

你真的想讓你的球成爲一個正方形嗎? 或者一個簡單的圓圈可以做到嗎?

您可以使用碰撞圓來代替,碰撞背後的邏輯比旋轉的方塊簡單得多......(如果你真的想要一個正方形和像素完美的碰撞,不管這個答案和Terrance的評論)

if(circle.Center.X - circle.Radius < ScreenBounds.XMin || 
    circle.Center.X + circle.Radius > ScreenBounds.XMax || 
    circle.Center.Y - circle.Radius < ScreenBounds.YMin || 
    circle.Center.Y + circle.Radius > ScreenBounds.YMax) 
{ 
    //Ball is partly or entirely outside of the screen 
} 

這是不是一個真正的直接回答你的問題,但更多的替代

編輯的:此代碼假定你的球的位置是相對於它的中心。

此外,你可以近似你的旋轉平方與碰撞圈(或事實上,一個非旋轉的方形)的碰撞。碰撞不會像素完美,但我認爲這幾乎不會引人注目。這也將更容易實施(考慮這是你的第一場比賽)。