C# 矩形包含问题

C# 矩形包含问题,c#,winforms,contains,C#,Winforms,Contains,我正在制作一个太空入侵者游戏,我使用linq方法来查看入侵者是否被玩家击中: foreach (var playerShot in playerShots) { if (isWeapon) { AliensHit = from invader2 in invaders where invader2.Area.Contains(playerShot.Area) select invade

我正在制作一个太空入侵者游戏,我使用linq方法来查看入侵者是否被玩家击中:

foreach (var playerShot in playerShots)
{
    if (isWeapon)
    {
        AliensHit = from invader2 in invaders
                    where invader2.Area.Contains(playerShot.Area)
                    select invader2;
    }
}
后来我有了一个算法,可以删除镜头和入侵者,但这并不重要 contains方法不起作用。 我发射了一个位图快照,它通过入侵者..(其区域属性正确更改,我使用调试器进行了检查,因此入侵者区域更改:它们都移动)。 然后我用一个较小的矩形镜头检查,如果矩形镜头在入侵者区域,它是否有效。两个都被移除了

AliensHit = from invader in invaders
            where invader.Area.Contains(playerShot.Location)
            select invader;

为什么当我放置一个区域来检查方法不工作时,我用调试器检查了3个小时,没有发现任何错误:(

这个问题听起来像是使用了
Contains
。当且仅当快照矩形完全位于入侵者矩形内时,这将返回
true
。对于较小的播放机,这将更经常发生

您可能想改用
.Intersect(playerShot.Area)
——如果两个区域完全重叠,则返回true


编辑:正如OP所指出的,
.IntersectsWith(playerShot.Area)
是我指的方法!

如果你的帧速率太低,那么镜头可能在每个时间步都移动得足够远,以至于完全跳过入侵者

解决此问题的一种方法是显著增加物理FPS,但仅在10个物理帧中每1帧绘制一次


另一种(可能更好)的方法是查看这条线(oldShotX,oldShotY)->(newShotX,newShotY)是否与入侵矩形相交。但只需启动FPS就容易多了。

我交换了这条线..它告诉我,在入侵2.Area.Intersect(playerShot.Area)的地方,我不能将void转换为bool错误的外壳。哦,等等。汉斯+1。等待结束了吗?