public void Remove(Collider collider) { if (!ColliderList.Contains(collider)) { return; } /* * foreach (Cell cell in GetCells(collider.WorldTransform)) * { * if (cell.Colliders.Contains(collider)) * { * cell.Colliders.Remove(collider); * } * } */ // OR ForEach((cell) => { if (cell.Colliders.Contains(collider)) { cell.Colliders.Remove(collider); } }); ComputedCollision.Remove(collider); ColliderList.Remove(collider); }
public void Reset() { ForEach((cell) => cell.Colliders.Clear()); ComputedCollision.Clear(); ColliderList.Clear(); }
public IEnumerable <Collider> GetCollisions(Collider collider) { if (!ComputedCollision.ContainsKey(collider)) { return(null); } return(ComputedCollision[collider]); }
public bool HasCollision(Collider collider) { if (ComputedCollision.ContainsKey(collider) && ComputedCollision[collider].Count > 0) { return(true); } return(false); }
public void ComputeCollision(Collider collider) { if (!ComputedCollision.ContainsKey(collider) || !collider.Collidable) { return; } Pair <Collider> test_pair = new Pair <Collider>(collider, null); IEnumerable <Cell> to_test; ColliderPhysics colliderPhy = null; Vector2 velocity = Vector2.Zero; if (collider is ColliderPhysics) { colliderPhy = collider as ColliderPhysics; velocity = colliderPhy.Velocity * GameCore.DeltaTime; to_test = GetCells(GetTransformVelocity(colliderPhy.WorldTransform, velocity)); } else { to_test = GetCells(collider.WorldTransform); } foreach (Cell cell in to_test) { foreach (Collider other in cell.Colliders) { test_pair.second = other; if (collider == other || !other.Collidable || CollisionPair.Contains(test_pair)) { continue; } if (colliderPhy.IsNotNull()) { if (SweptAABB(colliderPhy, other, velocity, out Vector3 normal)) { ComputedCollision[collider].Add(other); ComputedCollision[other].Add(collider); CollisionPair.Add(new Pair <Collider>(collider, other, normal)); } } else if (collider.WorldTransform.IntersectBox(other.WorldTransform)) { ComputedCollision[collider].Add(other); ComputedCollision[other].Add(collider); CollisionPair.Add(new Pair <Collider>(collider, other)); } } } }