矩形包含问题

时间:2011-04-16 18:46:07

标签: c# winforms contains

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

foreach (var playerShot in playerShots)
{
    if (isWeapon)
    {
        AliensHit = from invader2 in invaders
                    where invader2.Area.Contains(playerShot.Area)
                    select invader2;
    }
}

后来我有一个算法可以删除镜头和入侵者,但这并不重要 包含方法不起作用。 我发射了一个位图,它通过了入侵者..(它的Area属性正确更改,我检查了调试器,因此入侵区域发生了变化:它们都移动了。)。 然后我检查了一个较小的矩形镜头,如果矩形镜头在入侵者区域并且它工作。两者都被删除了。

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

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

2 个答案:

答案 0 :(得分:3)

问题听起来像Contains的使用。当且仅当镜头矩形完全在入侵者矩形内时,这将返回true。使用较小的玩家拍摄会更频繁地发生。

您可能希望使用.Intersect(playerShot.Area) - 如果两个区域完全重叠,则返回true。

编辑:如OP所述,.IntersectsWith(playerShot.Area)是我的意思!

答案 1 :(得分:1)

如果您的帧速率太低,那么每次拍摄的镜头可能会走得足够远,以便完全跳过入侵者。

解决这个问题的一种方法是显着增加物理FPS,但只能在10个物理帧中绘制每1帧。

另一种(可能更好)方法是查看(oldShotX,oldShotY) - >(newShotX,newShotY)是否与入侵者矩形相交。但是,仅仅提高FPS就容易多了。