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<SSSPBody> bodiesToCheck = World.QuadTree.Query(new Rect(left, top, Width*2, Height*2));
bodiesToCheck.Sort((a, b) => a.Position.Y.CompareTo(b.Position.Y));
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)) continue;
int encrX = 0, encrY = 0, numPxOverlapX, numPxOverlapY;
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;
if (left < bodyLeft) numPxOverlapX = right - bodyLeft;
else numPxOverlapX = bodyRight - left;
if (top < bodyTop) numPxOverlapY = bottom - bodyTop;
else numPxOverlapY = bodyBottom - top;
invokations.Add(new object[] {body, encrX, encrY});
if ((body.CollisionGroups.Any(IgnoreCollisionResolveGroups.Contains)) &&
InvokeOnResolve(body, new SSSPVector2(encrX, encrY))) continue;
if (numPxOverlapX > numPxOverlapY)
{
Position += new SSSPVector2(0, encrY);
if (encrY <= 0) IsCollidingOnTop = true;
if (encrY != 0) Velocity = new SSSPVector2(Velocity.X, 0);
}
else Position += new SSSPVector2(encrX, 0);
}
}