Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查碰撞的更简单方法?_C#_Winforms_If Statement - Fatal编程技术网

C# 检查碰撞的更简单方法?

C# 检查碰撞的更简单方法?,c#,winforms,if-statement,C#,Winforms,If Statement,我正在为uni做一项任务,我必须在visualstudio2010中使用C#Win表单创建一个突破游戏。目前,我的注意力集中在只有一块砖头需要销毁,所以在扩展之前,我先把机械师放下 为了澄清我当前的程序:我使用一个图片框作为图形对象,并使用计时器来创建动画效果。球可以在每帧跳过1到10个像素-这是为球创建随机起始向量的一部分 在检查球是否“击中”了我所画的砖块之前,这一切都很正常。我得到的是一个if语句,它检查球是否在图片框中对应于砖块轮廓的任何坐标处。我知道这个逻辑是正确的,因为它在某些时候是

我正在为uni做一项任务,我必须在visualstudio2010中使用C#Win表单创建一个突破游戏。目前,我的注意力集中在只有一块砖头需要销毁,所以在扩展之前,我先把机械师放下

为了澄清我当前的程序:我使用一个图片框作为图形对象,并使用计时器来创建动画效果。球可以在每帧跳过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>=brickX)&&&(x=brickY)&&&(y=brickX)&&&(x=brickY)&&&&(y一种方法,您可以简化此过程(我可能误解了您的规范),但是您可以在砖块的边界外制作一个矩形,并检查包含的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;
}
添加缓冲区:

int buffer = 5;
brickHit = new Rectangle(brickX,brickY,50,20).Inflate(buffer,buffer).Contains(x,y);
Rectagle类有时会派上用场。

这对我很有用:

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
}

这实际上很有道理。但是,当你说要在图片框的边界外制作一个矩形时,你的意思是砖块的大小与图片框的大小相同吗?如果你只做框的大小就可以了。边界(边界返回一个矩形)。如果你想让它膨胀以添加你想要的+5像素(充气将增加矩形的数量)。在你的情况下,如果你需要一个+5缓冲区,那么你需要“移动”矩形位置(偏移量(-5,-5)),然后充气(10,10)。(你应该仔细检查数学,因为已经晚了,但我想这就是你要找的).Contains返回一个布尔值,指示指定的点包含在矩形中。我在回答中更新了代码,以偏移并放大矩形。现在应该会得到一个各边都大+5的矩形。@Saladin刚刚重新阅读。我得到了图片框的边界,因为我以为那是砖块。我误解了好的。如果图片框不是砖块,那么你需要用你的砖块和砖块以及你描述的尺寸来制作矩形。哦,很好。不过,问题是:那会返回真/假值吗?@Saladin@Computer在这里不挑剔,但是1.Inflate返回void,你不能调用。包含在上面。你需要创建矩形,do充气作为单独的调用,然后调用包含在其中,也是2。充气时,它只会向下和向右移动增加砖块大小,如果您需要左侧和顶部的+5缓冲区,则需要先偏移矩形,如果您只需要左、右和底部的空间,然后偏移(-5,0)然后充气(10,5)
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
}