我正在构建一个太空入侵者游戏,我使用这个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个小时,发现没有错。 :(
答案 0 :(得分:3)
问题听起来像Contains
的使用。当且仅当镜头矩形完全在入侵者矩形内时,这将返回true
。使用较小的玩家拍摄会更频繁地发生。
您可能希望使用.Intersect(playerShot.Area)
- 如果两个区域完全重叠,则返回true。
编辑:如OP所述,.IntersectsWith(playerShot.Area)
是我的意思!
答案 1 :(得分:1)
如果您的帧速率太低,那么每次拍摄的镜头可能会走得足够远,以便完全跳过入侵者。
解决这个问题的一种方法是显着增加物理FPS,但只能在10个物理帧中绘制每1帧。
另一种(可能更好)方法是查看行(oldShotX,oldShotY) - >(newShotX,newShotY)是否与入侵者矩形相交。但是,仅仅提高FPS就容易多了。