我正在尝试实现一个函数,该函数检测两个矩形是否相交,即它们是否在不使用Rectangle.IntersectsWith
函数的情况下“接触”。
这样做的原因是因为我想确定与“英雄”对象发生碰撞的那一侧,但这是行不通的。
public bool[] Collisions(Rectangle hero, Rectangle rect)
{
bool hitSomethingAbove = false;
bool hitSomethingBelow = false;
bool hitSomethingOnTheRight = false;
bool hitSomethingOnTheLeft = false;
if (hero.Left < rect.Right) // collision on left side
{
hitSomethingOnTheLeft = true;
}
if (hero.Right > rect.Left) // collision on right side
{
hitSomethingOnTheRight = true;
}
if (hero.Top < rect.Bottom) // collision on top
{
hitSomethingAbove = true;
}
if (hero.Bottom > rect.Top) // collision on bottom
{
hitSomethingBelow = true;
}
return new bool[] { hitSomethingAbove, hitSomethingBelow,
hitSomethingOnTheRight, hitSomethingOnTheLeft };
}
答案 0 :(得分:0)
您的代码有一个问题,就是所有测试都假定英雄已经相对于另一个矩形处于某个位置。例如:
if (hero.Left < rect.Right) // collision on left side
假设英雄在此检查之前已经在另一个矩形的右边。如果英雄已经在另一个矩形的左侧,则您的测试现在声称该矩形的右侧发生了碰撞(即,根据您的代码注释,英雄的左侧发生了碰撞)。
所以您的逻辑在这里被破坏了。
答案 1 :(得分:0)
我建议使用Rectangle.Intersect
方法:
public bool[] Collisions(Rectangle hero, Rectangle rect)
{
var intersection = Rectangle.Intersect(hero, rect);
if(intersection.IsEmpty){
return new []{ false, false, false, false };
}
bool hitSomethingAbove = hero.Top == intersection.Top;
bool hitSomethingBelow = hero.Bottom == intersection.Bottom;
bool hitSomethingOnTheRight = hero.Right == intersection.Right;
bool hitSomethingOnTheLeft = hero.Left == intersection.Left;
return new bool[]
{
hitSomethingAbove,
hitSomethingBelow,
hitSomethingOnTheRight,
hitSomethingOnTheLeft,
};
}