Xna 如何从Game.Components中删除游戏组件?

Xna 如何从Game.Components中删除游戏组件?,xna,sprite,collision,monogame,Xna,Sprite,Collision,Monogame,基本上,我的游戏是用一块木板阻止岩石从天上掉下来。 我不确定哪些功能不正常,但以下是我的代码: 在RockManager课程中 public void CheckForPlankCollision(Plank plank) { foreach (GameComponent component in Game.Components) { if (component is FallingRock rock) { if (plan

基本上,我的游戏是用一块木板阻止岩石从天上掉下来。 我不确定哪些功能不正常,但以下是我的代码: 在RockManager课程中

public void CheckForPlankCollision(Plank plank)
{
    foreach (GameComponent component in Game.Components)
    {
        if (component is FallingRock rock)
        {
            if (plank.Bounds.Intersects(rock.Bounds))
            {
                rock.HandleCollision();
                Rectangle bounds = rock.Bounds;
            }
        }
    }
}
在岩石课上

public void HandleCollision()
{
    //rockPosition = rockAfterImpactPosition; // I tried to move it offscreen
    //rockPosition = Vector2.Zero; //I tried for any reaction
    //this.Enabled = false; // tried this
    //Game.Components.Remove(this); //tried this
}

我还尝试实施一个评分系统。(如果岩石撞击木板,则增加1点,如果岩石撞击地面,则减少1点)

尝试将此作为
IGameComponent
游戏组件
对象进行铸造

public void HandleCollision()
{
移除((GameComponent)这个);
}
告诉我这是否适合你


编辑:当
foreach(game.Components中的GameComponent组件)
循环不使用游戏对象时,您可能还希望将游戏对象的删除推迟到以后,在这段时间内,它可能会锁定删除元素。

尝试将
转换为
IGameComponent
游戏组件
对象

public void HandleCollision()
{
移除((GameComponent)这个);
}
告诉我这是否适合你


编辑:您可能还希望将游戏对象的删除推迟到以后,
foreach(game.Components中的GameComponent组件)
循环不使用该对象时,该循环可能会锁定在此期间删除元素。

我们需要更多信息来帮助您。您似乎正在使用一个框架来管理您的组件,我们需要知道是哪一个。我们可能还需要更多的代码,因为您添加的代码不足以正确理解情况。我更喜欢使用敌人列表(或岩石,在您的情况下)并在屏幕上可见时将岩石添加到岩石列表中,在需要移除岩石时将其从列表中移除。@abosquet他没有使用任何花哨的东西,这些都包含在@fdrobidoux中。你在这方面是100%正确的,我的错。我们需要更多的信息来帮助你。您似乎正在使用一个框架来管理您的组件,我们需要知道是哪一个。我们可能还需要更多的代码,因为您添加的代码不足以正确理解情况。我更喜欢使用敌人列表(或岩石,在您的情况下)并在屏幕上可见时将岩石添加到岩石列表中,在需要移除岩石时将其从列表中移除。@abosquet他没有使用任何花哨的东西,这些都包含在@fdrobidoux中。你在这方面是100%正确的,我的错。不客气。既然你这么说了,我想鼓励你把我的答案标记为解决你问题的答案。不客气。我很乐意鼓励你将我的答案标记为解决你问题的答案,因为你提到过。