首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >矩形包含问题

矩形包含问题
EN

Stack Overflow用户
提问于 2011-04-17 02:46:07
回答 2查看 1.7K关注 0票数 3

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

代码语言:javascript
复制
foreach (var playerShot in playerShots)
{
    if (isWeapon)
    {
        AliensHit = from invader2 in invaders
                    where invader2.Area.Contains(playerShot.Area)
                    select invader2;
    }
}

后来我有了一个算法,可以删除镜头和入侵者,但这并不重要,因为包含方法不起作用。我发射了一个位图的镜头,它穿过了入侵者。(我检查了调试器,它的面积属性正确地改变了,所以入侵者的区域也改变了:它们都移动了。)然后我检查了一个较小的矩形镜头,如果矩形镜头是在入侵者的区域,它是有效的。两个都被移除了。

代码语言:javascript
复制
AliensHit = from invader in invaders
            where invader.Area.Contains(playerShot.Location)
            select invader;

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-17 03:08:26

这个问题听起来像是使用了Contains。当且仅当镜头矩形完全位于入侵者矩形内时,才会返回true。对于较小的playerShot,这种情况会更频繁地发生。

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

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

票数 3
EN

Stack Overflow用户

发布于 2011-04-17 03:19:10

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

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

另一种(可能更好的)方法是查看(oldShotX,oldShotY)->(newShotX,newShotY)线是否与入侵者矩形相交。但是直接启动FPS要容易得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5688730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档