XNA 碰撞怪异行为

本文关键字:碰撞 XNA | 更新日期: 2023-09-27 18:32:43

我正在阅读"学习XNA 4.0"一书,我正在面向对象设计部分。我在 2 个矩形的碰撞中遇到了一个奇怪的问题。

我有一个自动精灵列表和一个玩家类,这两个类都派生自精灵类。在更新方法中,我正在检查播放,并且 aotomatedSprite 矩形相互接触,现在当我越过列表时,我有一个名为触摸的字符串,它代表碰撞。

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

本书提供的测试代码是Game.Exit()是否发现了任何 collison。这适用于列表中的每个自动化精灵,但是当我将其更改为我的简单测试时,它就像我只检查 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);
    }

编辑-------------------------------------------------------------------------溶液: 我在游戏开发部分问它,我得到了答案。 我必须在foreach循环中有一个break;,这样它就不会在找到一个集合后继续前进。

XNA 碰撞怪异行为

这是因为您的代码不断覆盖触摸变量,因此最终只显示最后一个结果。

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

if (sprite.collisionRect.Intersects(player.collisionRect) || touching == "touching")
这样,如果任何精灵触摸

到您的玩家精灵,您将获得"触摸"。