2012-04-29 84 views
1

我正在讀「學習XNA 4.0」一書,而且我在面向對象的設計部分。我有一個奇怪的問題與兩個矩形的碰撞。XNA碰撞怪異行爲

我有一個從類Sprite派生的automateSprite和Player類的列表。 在更新方法中,我正在檢查播放,並且aotomatedSprite矩形相互接觸,現在,當我查看列表時,我有一個名爲「碰觸」的字符串,表示碰撞。

我的問題是可觸摸的觸摸,只有當玩家Sprite觸摸列表中的最後一個automateSprite時纔會改變。

本書爲測試提供的代碼是Game.Exit(),如果發現任何碰撞。 這對列表中的每個automatedSprite都有效,但是當我將其更改爲我的簡單測試時,它的行爲就像我只檢查4個automatedSprite列表中的最後一個項目。

這裏是代碼:

string touching = ""; 
public override void Update(GameTime gameTime) 
    { 
     // TODO: Add your update code here 
     player.Update(gameTime, Game.Window.ClientBounds); 

     foreach (Sprite sprite in spriteList) 
     { 
      sprite.Update(gameTime, Game.Window.ClientBounds); 
      if (sprite.collisionRect.Intersects(player.collisionRect)) 
       touching = "touching"; 
      else 
       touching = "not touching"; 
     } 

     base.Update(gameTime); 
    } 

    public override void Draw(GameTime gameTime) 
    { 
     spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend); 


     spriteBatch.DrawString(font, touching, Vector2.Zero, Color.Red); 

     player.Draw(gameTime, spriteBatch); 
     foreach (Sprite sprite in spriteList) 
     { 
      sprite.Draw(gameTime, spriteBatch); 

     } 

     spriteBatch.End(); 
     base.Draw(gameTime); 
    } 

編輯--------------------------------- ---------------------------------------- 解決方案: 我在遊戲中問它開發部分,我得到了答案。 我不得不在foreach循環中有一個break;,所以在發現碰撞後它不會繼續。

回答

2

這是因爲你的代碼不斷覆蓋觸摸變量,所以最終只顯示最後一個結果。

在foreach之前重置感人變量,用touching = "";和延伸,如果是這樣的:

if (sprite.collisionRect.Intersects(player.collisionRect) || touching == "touching") 

這樣,您將得到「觸摸」如果有任何的精靈都在觸摸你的球員精靈。

+0

謝謝,但它仍然給了我同樣的結果,我在遊戲開發中問及它,並告訴我在有任何碰撞的時候使用破解。 – samy 2012-04-29 14:43:09

+0

好,糾正它。無論如何,這也可以起作用。 – Matzi 2012-04-29 14:51:59