Monogame/C# - 检查前一帧是否存在碰撞

Monogame/C# - Check if collision was present in previous frame

我的 Monogame/C# 项目中有一个可用的碰撞系统,它使用四叉树来确定潜在的碰撞,并相应地对其进行测试。我的问题是我希望能够向实体(已发生碰撞)发送方法,OnCollisionEnter() 或 OnCollisionStay() 取决于碰撞是否存在于前一帧中。

在以下代码中,永远不会调用 OnCollisionEnter():

public class Collision : iSystem
{
    private List<Entity> currentCollisions; // Collisions occurring in the current frame
    private List<Entity> previousCollisions; // Collisions from the previous frame

    public override void Initialize(Entity caller)
    {
        currentCollisions = new List<Entity>();
        previousCollisions = new List<Entity>();
        base.Initialize(caller);
        hasInitialized = true;
    }

    public override void Update(GameTime gameTime)
    {
        List<Entity> nearby = Global.QuadTree.GetNeighbours(parent);

        for (int i = 0; i < nearby.Count; i++)
        {
            if (nearby[i] != parent)
                if (parent.Collider.Intersects(nearby[i].Collider))
                {
                    currentCollisions.Add(nearby[i]);
                    AlertEntity(nearby[i]);
                }
        }


        previousCollisions = currentCollisions; // Ready for the next frame
        currentCollisions.Clear();
        base.Update(gameTime);
    }

    public void AlertEntity(Entity entity)
    {
        if (previousCollisions.Contains(entity))
           parent.OnCollisionStay(entity.Collider);
        else
           parent.OnCollisionEnter(entity.Collider); // This is never called
    }
}

('parent'指的是组件'Collision'所附加的实体)

如果您能说明发生这种情况的原因,我将不胜感激。谢谢

调用 currentCollisions.Clear() 也会清除 previousCollisions,因为它们都引用同一个 List 对象。您应该将其设置为 new List<Entity>().

,而不是调用 currentCollisions.Clear()
// . . .

previousCollisions = currentCollisions; // Ready for the next frame
currentCollisions = new List<Entity>(); // Now both lists are not clear
base.Update(gameTime);