c#形式:检查两个矩形相撞的位置

时间:2013-10-21 07:52:28

标签: c# .net collision-detection rectangles

        foreach (var rect in listRect)
        {
            foreach (var rect2 in listRect)
            {
                if (Rectangle.Intersect(rect.r,rect2.r) != Rectangle.Empty && rect != rect2)
                {
                    if (rect.r.Left < rect2.r.Right) 
                        rect.speedX = ran.Next(-6,-4);
                        rect2.speedX = ran.Next(4, 6);

                    if (rect.r.Right > rect2.r.Left)
                        rect.speedX = ran.Next(4, 6);
                        rect2.speedX = ran.Next(-6, -4);

                    if (rect.r.Top < rect2.r.Bottom)
                        rect.speedY = ran.Next(4, 6);
                        rect2.speedY = ran.Next(-6, -4);

                    if (rect.r.Bottom > rect2.r.Top)
                        rect.speedY = ran.Next(-6, -4);
                        rect2.speedY = ran.Next(4, 6);

这是我目前用于检查两个矩形是否发生碰撞的函数的代码。然后,如果检测到碰撞,则应该调整矩形的速度,使它们沿相反方向移动。

我可能想象的代码不起作用,我无法弄清楚我应该如何解决这个问题。

矩形保存在名为listRect的列表中,矩形的类看起来像这样:

class myRectangle
{
    public Rectangle r = new Rectangle();
    public int speedX = 5;
    public int speedY = 5;
}

如何进行简单的碰撞检测,以便我知道它们碰撞的位置以及如何在if-else语句中使用它?

3 个答案:

答案 0 :(得分:1)

首先,你必须首先与其他人比较,例如

for(int first=0; first<listRect.Count;first++)
{
    for(int second=first+1;second<listRect.Count;second++)
    {
    }
}

下一步你必须检查位置矩形

if(listRect[first].r.X<listRect[second].r.X)
{
   if(listRect[first].r.Right > listRect[second].r.Left)
   {
       listRect[first].speedX = ran.Next(-6,-4);
       listRect[second].speedX = ran.Next(4, 6);
   }
}
else
{
    if(listRect[first].r.Left < listRect[second].r.Right)
    {
       listRect[first].speedX = ran.Next(4, 6);
       listRect[second].speedX = ran.Next(-6,-4);
    }
}

同样适用于上下。

答案 1 :(得分:0)

如何使用rectangle.intersect?我认为这具有您想要的功能,并为您节省了一些代码..

你可以这样使用它:

if (Rect.r.IntersectsWith(rect2.r))
                {
                    if (rect.r.Left < rect2.r.Left) 
                        rect.speedX = ran.Next(-6,-4);
                        rect2.speedX = ran.Next(4, 6);

                    if (rect.r.Left > rect2.r.Left)
                        rect.speedX = ran.Next(4, 6);
                        rect2.speedX = ran.Next(-6, -4);

                    if (rect.r.Top < rect2.r.Top)
                        rect.speedY = ran.Next(4, 6);
                        rect2.speedY = ran.Next(-6, -4);

                    if (rect.r.Top > rect2.r.Top)
                        rect.speedY = ran.Next(-6, -4);
                        rect2.speedY = ran.Next(4, 6);
                }

您可以在msdn上找到文档。

编辑:你还需要比较从左到左,从上到下(或从右到右,从下到下等等)来改变你的速度,我编辑了代码片段。

答案 2 :(得分:0)

我认为你不应该将元素的左边与另一个元素的右边比较。请考虑以下代码:

                if (rect.r.Left < rect2.r.Left) 
                    rect.speedX = ran.Next(-6,-4);
                    rect2.speedX = ran.Next(4, 6);

                if (rect.r.Left > rect2.r.Left)
                    rect.speedX = ran.Next(4, 6);
                    rect2.speedX = ran.Next(-6, -4);

                if (rect.r.Top < rect2.r.Top)
                    rect.speedY = ran.Next(4, 6);
                    rect2.speedY = ran.Next(-6, -4);

                if (rect.r.Top > rect2.r.Top)
                    rect.speedY = ran.Next(-6, -4);
                    rect2.speedY = ran.Next(4, 6);

您只需知道每个矩形的哪一侧有哪个矩形。我也建议你这样做:

                    rect.speedX = -1 * rect.speedX;
                    rect2.speedY = -1 * rect.speedY;

检查相对于另一个矩形的哪个矩形不会显示碰撞面。