C# 如何测试一个矩形是否在另一个矩形中?

C# 如何测试一个矩形是否在另一个矩形中?,c#,java,c++,collision-detection,C#,Java,C++,Collision Detection,好吧,我正在做一个游戏,我发现我的敌人不喜欢我的碰撞检测,因为它对我的玩家非常有效。经过一点调试,我发现这是因为我的敌人比我的牌大,而我的播放器比我的牌小 现在我需要有能力制造大的敌人和老板,所以这是不行的。所以我需要找到一种更好的方法来测试碰撞检测。我现在就是这样做的: 上下: if((enemy.left > tile.left && enemy.left < tile.right || enemy.right > tile.left &&

好吧,我正在做一个游戏,我发现我的敌人不喜欢我的碰撞检测,因为它对我的玩家非常有效。经过一点调试,我发现这是因为我的敌人比我的牌大,而我的播放器比我的牌小

现在我需要有能力制造大的敌人和老板,所以这是不行的。所以我需要找到一种更好的方法来测试碰撞检测。我现在就是这样做的:

上下:

if((enemy.left > tile.left && enemy.left < tile.right || enemy.right > tile.left && enemy.right < tile.right) && enemy.top < tile.bottom && enemy.bottom > tile.top){
    //collision
}
if((敌方.left>tile.left和敌方.lefttile.left和敌方.righttile.top){
//碰撞
}
左右:

if((enemy.top > tile.top && enemy.top < tile.bottom || enemy.bottom > tile.top && enemy.bottom < tile.bottom) && enemy.left < tile.right && enemy.right > tile.left){
     //colision
}
if((敌方.top>tile.top和敌方.toptile.top和敌方.bottomtile.left){
//结肠炎
}

在.NET语言中,您可以使用
矩形.IntersectsWith(矩形其他)
方法执行非常基本的碰撞检测。

我认为问题在于

enemy.top < tile.bottom && enemy.bottom > tile.top
敌方.toptile.top
(在第一个代码中),只有在敌方完全位于地砖内(高度方向)时,才会出现这种情况

敌方.top>tile.top和敌方.toptile.top和敌方.bottom
就像你做的左+右检查一样

为了澄清这一点,您提供的第一张支票是:

if((enemy.left > tile.left && enemy.left < tile.right || enemy.right > tile.left && enemy.right < tile.right) && (enemy.top > tile.top && enemy.top < tile.bottom || enemy.bottom > tile.top && enemy.bottom < tile.bottom)){
//collision
if((敌方.left>tile.left和敌方.lefttile.left和敌方.righttile.top和敌方.toptile.top和敌方.bottom
}


有了这个,我认为你不需要单独的上/下左/右检查,如果敌人的任何部分在瓦片中,这应该会返回true。在Java中,使用。

精灵比瓦片宽,但是“左-右”代码不会检查这种情况。 如果我将您的代码绘制成图形,它只会检查敌方左侧还是敌方右侧位于互动程序中:

(enemy.left > tile.left && enemy.left < tile.right
|| enemy.right > tile.left && enemy.right < tile.right)

// graphed as<br>
// TL EL TR ----- or ----- TL ER TR<br>
同样,瓷砖在垂直方向上比敌人小,因此有必要检查整个瓷砖是否位于敌人内部。 完整的图形/伪代码为:

 is_hit :
 // T{L,R,T,B} => tile, E{L,R,T,B} => enemy
 // left-right:
 [
  TL EL TR ----- or ----- TL ER TR
           . or .
  EL TL ----- and ----- TR ER
 ]
 .and.
 // top-bottom:
 [
  TT ET TB ----- or ----- TT EB TB
           . or .
  ET TT ----- and ----- TB EB
 ]

下面是如何正确执行分离轴测试(对于定向边界框,就像您正在做的那样)

if(firstObject.LeftsecondObject.Left
&&firstObject.TopsecondObject.Top)
{
//交叉
}
转到这个站点,使用图3,一次一个地实现所有这些。然后一次一个地打破每个测试。您将从经验上看到它是有效的,并且非常简单:


如果您喜欢,请通读整套教程。一旦你开始在游戏中添加更多功能,这将是值得的:)

对于任何在Objective-C中工作的人来说,如果他们想找到你可以使用的相同答案:

bool CGRectIntersectsRect(CGRect rect1, CGRect rect2)

.Net
类中已经有一个名为
相交(Rect Rect)
的方法。

你的精灵是纯矩形的吗?它是52x32,瓷砖是50x50。我的意思是,对于大多数游戏来说,精灵的碰撞检测不是简单地检测重叠的矩形,例如,如果你的敌人和你的化身都是圆形的,即使矩形是重叠的,也没有实质性的崩溃。下面有很多答案,所以我将添加一条评论。您希望以早期碰撞检测为目标。为了做到这一点,您实际上希望在不可能发生冲突时检查的值,并从检查中返回False。例如,如果(object1.bot is_hit : // T{L,R,T,B} => tile, E{L,R,T,B} => enemy // left-right: [ TL EL TR ----- or ----- TL ER TR . or . EL TL ----- and ----- TR ER ] .and. // top-bottom: [ TT ET TB ----- or ----- TT EB TB . or . ET TT ----- and ----- TB EB ]
if (firstObject.Left < secondObject.Right && firstObject.Right > secondObject.Left
    && firstObject.Top < secondObject.Bottom && firstObject.Bottom > secondObject.Top)
{
    // Intersecting
}
bool CGRectIntersectsRect(CGRect rect1, CGRect rect2)