public void Update() { IsCollidingOnTop = false; IsCollidingOnBottom = false; IsCollidingOnLeft = false; IsCollidingOnRight = false; if (IsAffectedByGravity) Velocity += World.Gravity; Position += Velocity; int left = CornerMin.X; int right = CornerMax.X; int top = CornerMin.Y; int bottom = CornerMax.Y; List bodiesToCheck = World.Bodies; for (int i = 0; i < bodiesToCheck.Count; i++) { SSSPBody body = bodiesToCheck[i]; if (body == this || IgnoreCollisionDetectBodies.Contains(body) || body.CollisionGroups.Any(IgnoreCollisionDetectGroups.Contains)) continue; int bodyLeft = body.CornerMin.X; int bodyRight = body.CornerMax.X; int bodyTop = body.CornerMin.Y; int bodyBottom = body.CornerMax.Y; if(SSSPUtils.IsOverlapping(this, body)) { int encrX = 0; int encrY = 0; if (bottom < bodyBottom && bottom >= bodyTop) encrY = bodyTop - bottom; else if (top > bodyTop && top <= bodyBottom) encrY = bodyBottom - top; if (left < bodyLeft && right >= bodyLeft) encrX = bodyLeft - right; else if (right > bodyRight && left <= bodyRight) encrX = bodyRight - left; int numPxOverlapX = 0; int numPxOverlapY = 0; if (left < bodyLeft) numPxOverlapX = right - bodyLeft; else numPxOverlapX = bodyRight - left; if (top < bodyTop) numPxOverlapY = bottom - bodyTop; else numPxOverlapY = bodyBottom - top; if(numPxOverlapX > numPxOverlapY) { Position += new SSSPVector2(0, encrY); if (encrY <= 0) IsCollidingOnTop = true; } else { Position += new SSSPVector2(encrX, 0); } } } }