2012-04-29 4 views
1

私は「Learning XNA 4.0」という本を読んでいますが、私はオブジェクト指向の設計部分です。私は2つの長方形の衝突に奇妙な問題を抱えています。XNAの衝突奇妙な振る舞い

私はautomateSpriteとPlayerクラスの両方のリストをSpriteクラスから派生しています。 更新方法で私は遊びをチェックしており、aotomatedSpriteの四角形が互いに接触しています。リストを乗り越えたら、衝突を表すtouchingという文字列があります。

私の問題は、プレイヤー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); 
    } 

編集:

ここ

コードです---------------------------------------- 解答: 私はゲームで尋ねますdevlopmentセクションと私は答えを得た。 私はbreak;をforeachループに持っていなければならなかったので、それはコリソンを見つけた後も続かないでしょう。

答えて

2

これは、コードが常にタッチ変数を上書きするためです。そのため、最後に結果が表示されるだけです。 foreachの前

は、touching = "";で、感動的変数をリセットして、このような場合を拡張:あなたがスプライトのいずれかがあなたのプレイヤーのスプライトに触れている場合は、「触れる」でしょう

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

この方法です。

+0

ありがとう、それでも私は同じ結果を与えた、私はゲーム開発でそれを尋ねたと1は、コリソンがあるときforeachで休憩を使用するように私に言った。 – samy

+0

さて、修正しました。とにかく、それも働くことができます。 – Matzi