2011-04-16 46 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。