2010-11-13 68 views
4

我正在爲uni工作,我必須在Visual Studio 2010中使用C#Win Forms創建Breakout遊戲。目前,我正在專注於只有一塊磚被摧毀,所以在擴展它之前,我已經讓這些技工失效了。更簡單的方法來檢查碰撞?

澄清我的當前程序:我使用圖片框作爲圖形對象和計時器來創建動畫效果。球可以在每個幀中跳過1到10個像素 - 這是創建球的隨機起始矢量的一部分。

這工作得很好,直到它檢查球是否'撞到'我繪製的磚。我所擁有的是if語句,用於檢查球是否位於與磚的輪廓對應的圖片框上的任何座標處。我知道這個邏輯很好,因爲它在一段時間內都有效。但是,由於球位置的「跳躍」變化,我需要爲我的if語句添加+/- 5像素的緩衝區。

這是哪裏的問題出現了,因爲我的if聲明(二,真)是真的複雜,因爲它是:

// Checks if ball hits left side or top of brick 
if (((x >= brickX) && (x <= (brickX + 50)) && (y == brickY)) || 
    ((y >= brickY) && (y <= (brickY + 20)) && (x == brickX))) 
{ 
    brickHit = true; 
} 
// Check if ball hits right side or bottom of brick 
else if ((((x >= brickX) && (x <= brickX + 50)) && (y == (brickY + 20))) || 
    (((y >= brickY) && (y <= brickY + 20)) && (x == brickX + 50))) 
{ 
    brickHit = true; 
} 

對於澄清:x和y是球brickX的座標而brickY是矩形磚左上角的座標(寬50像素,高10像素)。

有什麼辦法可以簡化上面的if語句嗎?如果我可以讓它們變得更簡單,我知道在'緩衝區'(它只需要5個像素在磚的輪廓的任一側,以允許球的位置改變)中添加會容易得多。

如果需要進一步澄清,請問 - 我在5點12分寫這個問題,所以我知道我可能有點不清楚。

回答

3
brickHit = new Rectangle(brickX,brickY,50,20).Contains(x,y); 

加入緩衝液:

int buffer = 5; 
brickHit = new Rectangle(brickX,brickY,50,20).Inflate(buffer,buffer).Contains(x,y); 

的Rectagle類有時可以派上用場。

+0

哦,很好。不過,問題是:它是否返回真/假值? – 2010-11-13 05:32:00

+2

@Saladin @Computer在這裏不要挑剔,但1.膨脹返回void,你不能調用.Contains就可以了。您需要創建矩形,將Inflate作爲單獨的呼叫進行調用,然後調用其中包含的對象,也是2.在Inflate上擡頭,它只會移動增加的磚塊大小向右,如果您需要在左側和頂部需要+5緩衝區,如果您只需要左側,右側和底部的空間,然後偏移(-5,0)然後膨脹(10,5),需要首先偏移矩形。 – pstrjds 2010-11-13 05:56:47

5

有一種方法可以簡化這個操作(我可能會誤解你的規範),但是你可以使一個矩形離開磚的邊界並檢查包含你的x,y點。

Rectangle rec = new Rectangle(brickX, brickY, 50, 20); 
rec.Offset(-5, -5); 
rec.Inflate(10, 10); 
if (rec.Contains(new Point(x,y)) 
{ 
    brickHit = true; 
} 
+0

這實際上使得有很大的意義。但是,當你說要將一個矩形放在圖片框的邊界之外時,你的意思是這個圖塊的大小與圖片框的大小相同嗎? – 2010-11-13 05:25:38

+0

它會,如果你只是做Box.Bounds(邊界返回一個矩形)。如果你想要的話,你可以膨脹它來添加你正在尋找的+5像素(膨脹會將數量添加到矩形中)。在你的情況下,如果你需要一個+5的緩衝區,那麼你需要「移動」矩形的位置(偏移量(-5,-5))然後膨脹(10,10)。 (你應該仔細檢查數學,因爲它遲到了,但我認爲這就是你正在尋找的)。 Contains返回一個布爾值,表示指定的Point包含在矩形中。 – pstrjds 2010-11-13 05:41:41

+0

我更新了我的答案中的代碼偏移和膨脹矩形。這現在應該給你一個四邊形都是+5的矩形。 – pstrjds 2010-11-13 05:43:52

0

這爲我工作:

var rect1 = new System.Drawing.Rectangle(pictureBox1.Location, 
pictureBox1.Size); 
var rect2 = new System.Drawing.Rectangle(pictureBox2.Location, 
pictureBox2.Size); 

if (rect1.IntersectsWith(rect2)) 
{ 
    //code when collided 
}