删除碰撞的东西?

我有我的碰撞检测代码工作,所以当我的玩家与它碰撞时,如何告诉我的HealthPickup消失? 我还没有玩过它,但我想我可能不得不删除hitbox并停止调用Draw()函数(至less对于我的HealthPickup)

请注意我是新手,以前没有真正处理过XNA。

如果你有一个实体列表或者一连串的魔药列表,你可以直接从列表中删除这个实体。 无论如何,这应该是标准的做法,因为这样可以非常容易地添加更多的项目,而无需分配大量的variables。

如果您的健康提取是一个对象,那么如果检测到碰撞,则可以将其设置为null。 垃圾收集器将为您完成剩下的工作。 但不要尝试引用该对象之后它为空,因为它会给你一个运行时错误。

 if(player.collides(healthpotion)) { player.health += 100; healthpotion = null; } 

给Rokk的答案补充一点。

有机会,既然你说你是XNA的GameComponentList ,那么你在Game类中使用了GameComponentList ,即Components

如果是这样,那么解决scheme很简单。 只要确保您可以从碰撞代码中访问该Components列表并使用Components.Remove(healthPickup); 。 你的游戏现在停止绘制它,垃圾收集器将会(如果你没有从其他地方引用它)为你清理它。

如果你没有使用我正在讨论的组件列表,那么这取决于你的代码。 这也是我把你引回到Rokk的答案的地方。


编辑:一些例子和explenation支持我的评论。

在我的评论中,我提到了一个DrawableGameComponent 。 你提到什么都没有发生。 我可以猜出为什么没有发生什么事情,你可能会错过在你的游戏类的基类的调用。 下面的例子。

 public class Game1 : Game { protected override void Initialize() { Components.Add(new HealthPickup(/* constructor arguments here */)); } protected override void Update(GameTime gameTime) { //Next line will call Update(GameTime) on all Components in Components. base.Update(gameTime); } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(/* Your color here */); //Next line will call Draw(GameTime) on all DrawableComponents in Components. base.Draw(gameTime);; } } 

我在Draw()Update()调用的base.something调用确保XNA调用每个DrawableGameComponentDraw()和每个GameComponent (包括DrawableGameComponent )的Update() )。

那么你的HealthPickup应该有以下内容:

 public class HealthPickup : DrawableGameComponent { //Ignoring constructor and other component stuff for the sake of an example. //Adding this component to the GameComponentList causes this function //to be called during every update cycle. public override void Update(GameTime gameTime) { base.Update(gameTime); //TODO update logic here... } public override void Draw(GameTime gameTime) { base.Draw(gameTime); //TODO draw logic here... } } 

如果你有这个,那么每个更新周期都应该调用HealthPickup。

也许一些很好的阅读是本指南 。 它不包括类,但它确实涵盖了XNA的基础知识。 它会忽略组件列表,所以你必须相信上面的例子。