2011-04-16 48 views
3

我建立一个太空入侵者游戏,我用这个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个小时,发现没有错。 :(

+1

套管错了。等一下。 – 2011-04-16 19:36:12

+0

+1给Hans。等完了? – Independent 2011-04-16 19:45:48

回答

3

的问题听起来像使用Contains。这将返回true当且仅当拍摄矩形完全是入侵者矩形内,随着小playerShot这会更频繁地发生。

你可能想使用.Intersect(playerShot.Area)而不是 - 如果这两个区域重叠,在这一切将返回true

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

+0

我swaped这条线..它告诉我我无法将void转换为布尔invader2.Area.Intersect(playerShot.Area) – 2011-04-16 19:29:26

+1

它不是相交()它是intersectWith ...现在感谢它的工作! – 2011-04-16 19:35:22

+0

@Dmitrry,哎呀它返回一个矩形 - 我会编辑我的答案 – 2011-04-16 19:36:38

1

如果你的帧速率太低,那么!镜头可能运行得足够远在每个时间步骤完全跳过入侵者。

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

另一种可能更好的方法是查看(oldShotX,oldShotY) - >(newShotX,newShotY)是否与入侵者矩形相交。但是更简单的方法是调整FPS。