2012-04-29 67 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