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);
我的 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);