我正在阅读“学习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;
,所以在发现碰撞后它不会继续运行。
答案 0 :(得分:2)
这是因为你的代码不断覆盖触摸变量,所以最后只会在其中显示最后的结果。
在foreach之前,使用touching = "";
重置触摸变量并将if扩展为:
if (sprite.collisionRect.Intersects(player.collisionRect) || touching == "touching")
这样,如果任何精灵正在触碰你的玩家精灵,你就会“触碰”。