矩形包含问题

本文关键字:问题 包含 | 更新日期: 2023-09-27 17:50:17

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

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

之后,我有了一个算法来删除镜头和入侵者,但这并不重要contains方法不起作用。我发射一枪,这是一个位图,它穿过入侵者…(它的Area属性更改正确,我与调试器进行了检查,因此入侵者Area更改:它们都移动了。)然后我检查了一个较小的矩形射击,如果矩形射击在入侵者区域,它就会起作用。

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

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

矩形包含问题

问题听起来像是使用了Contains。当且仅当射击矩形完全在入侵矩形内时,它将返回true。使用较小的playerShot,这种情况会更频繁地发生。

你可能想用.Intersect(playerShot.Area)代替——如果两个区域重叠,它将返回true。

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

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

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

另一种(可能更好的)方法是查看 (oldShotX, oldShotY)->(newShotX, newShotY)是否与入侵矩形相交。但是,直接提高FPS要简单得多。