private void CheckCollisionsInGroup(GameTime gameTime, List <ICutlassCollidable> collidableObjects) { if (collidableObjects == null || collidableObjects.Count <= 1) { return; } for (int i = 0; i < collidableObjects.Count; i++) { ICutlassCollidable first = collidableObjects[i]; for (int j = i + 1; j < collidableObjects.Count; j++) { ICutlassCollidable second = collidableObjects[j]; bool collisionCategoriesOverlap = CheckCollisionCategories(first, second); //If both are stationary, or neither is stationary, detect collision but don't do anything about it. if (first.Stationary == second.Stationary) { if (collisionCategoriesOverlap && first.NextFrameBoundingRect.Intersects(second.NextFrameBoundingRect)) { first.CollisionDetected(second); second.CollisionDetected(first); } } //If only one is stationary, detect collision and correct non-stationary object else { //contact.A is non-stationary object. CollisionContact collisionContact; if (first.Stationary) { collisionContact = new CollisionContact() { A = second, B = first } } ; else { collisionContact = new CollisionContact() { A = first, B = second } }; if (collisionCategoriesOverlap && CalculateCollisionCorrection(gameTime, ref collisionContact) && !IsInternalEdge(collisionContact)) { collisionContact.A.CollisionDetectedWithCorrection(collisionContact.B, collisionContact.Normal, collisionContact.Distance); collisionContact.B.CollisionDetected(collisionContact.A); } } } } }