1

我正在阅读“Learning XNA 4.0”一书,我在面向对象的设计部分。我对 2 个矩形的碰撞有一个奇怪的问题。

我有一个automatedSprite 列表和一个Player 类,它们都派生自Sprite 类。在更新方法中,我正在检查播放并且 aotomatedSprite 矩形相互接触,现在当我越过列表时,我有一个名为 touch 的字符串表示碰撞。

我的问题是真正的触摸,只有当玩家精灵触摸列表中的最后一个自动精灵时才会改变。

本书提供的测试代码是Game.Exit()在发现任何冲突时执行的。这适用于列表中的每个自动精灵,但是当我将其更改为我的简单测试时,它就像我只检查 4 个自动精灵列表中的最后一项。

这是代码:

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

这是因为您的代码会不断覆盖touching 变量,所以最后只显示最后一个结果。

在 foreach 之前,重置 touch 变量,touching = "";并像这样扩展 if:

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

这样,如果任何精灵正在触摸您的玩家精灵,您将获得“触摸”。

于 2012-04-29T14:30:47.833 回答