1
        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 语句中使用它?

4

3 回答 3

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);
    }
}

上下也类似。

于 2013-10-21T08:02:19.750 回答
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上找到文档。

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

于 2013-10-21T08:12:58.490 回答
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;

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

于 2013-10-21T08:19:18.037 回答