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语句中使用它?
答案 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;
检查相对于另一个矩形的哪个矩形不会显示碰撞面。