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;
,这样它就不会在找到一个集合后继续前进。
这是因为您的代码不断覆盖触摸变量,因此最终只显示最后一个结果。
在 foreach 之前,使用 touching = "";
重置触摸变量并像这样扩展 if:
if (sprite.collisionRect.Intersects(player.collisionRect) || touching == "touching")
这样,如果任何精灵触摸到您的玩家精灵,您将获得"触摸"。