XNA碰撞奇怪的行为

时间:2012-04-29 13:48:21

标签: c# xna xna-4.0

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

我有一个自动命名列表和一个从类Sprite派生的Player类。 在更新方法中,我正在检查游戏,并且aotomatedSprite矩形相互接触,现在当我越过列表时,我有一个名为touch的字符串代表碰撞。

我的问题是可靠的触摸,只有在玩家Sprite触摸列表中的最后一个automateSprite时才会改变。

本书为测试提供的代码是Game.Exit(),如果找到了任何一个collison。 这适用于列表中的每个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;,所以在发现碰撞后它不会继续运行。

1 个答案:

答案 0 :(得分:2)

这是因为你的代码不断覆盖触摸变量,所以最后只会在其中显示最后的结果。

在foreach之前,使用touching = "";重置触摸变量并将if扩展为:

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

这样,如果任何精灵正在触碰你的玩家精灵,你就会“触碰”。