1

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

クラス Sprite から派生した、automateSprite と Player クラスのリストがあります。update メソッドでは、再生をチェックしており、aotomatedSprite の四角形が互いに接触しています。リストを通過すると、衝突を表す touch という文字列ができました。

私の問題は、プレーヤーのスプライトがリスト内の最後のautomaticSpriteに触れた場合にのみ変化します。

テストのために本が提供するコードは、Game.Exit()衝突が見つかった場合に実行することです。リスト内のすべてのautomaticSpriteで機能しますが、単純なテストに変更すると、4つのautomaticSpriteのリストから最後の項目のみをチェックするように動作します.

コードは次のとおりです。

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);
    }

編集 - - - - - - - - - - - - - - - - - - - - - - - - - ------------------------ 解決策: ゲーム開発セクションで質問したところ、回答が得られました。break;衝突が見つかった後は続行しないように、foreach ループに含める必要がありました。

4

1 に答える 1

2

これは、コードが接触変数を常に上書きするためであり、最終的には最後の結果のみが表示されます。

foreach の前に、触れる変数をリセットし、touching = "";次のように if を拡張します。

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

このようにして、スプライトのいずれかがプレーヤーのスプライトに触れている場合に「触れる」ことができます。

于 2012-04-29T14:30:47.833 に答える