更简单的方法来检查碰撞?

时间:2010-11-13 05:13:51

标签: c# winforms if-statement

我正在为uni工作,我必须使用C#Win Forms在Visual Studio 2010中创建一个Breakout游戏。目前,我正专注于只有一块砖被摧毁,所以在扩展它之前我有机械师。

澄清我当前的程序:我使用一个图片框作为Graphics对象和一个计时器来创建动画效果。球可以在每个帧上跳过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 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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);

Rectangle类有时会派上用场。

答案 2 :(得分: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
}