public void Update() { IsCollidingOnTop = false; IsCollidingOnBottom = false; IsCollidingOnLeft = false; IsCollidingOnRight = false; List invokations = new List(); if (IsAffectedByGravity) Velocity += World.Gravity; SSSPVector2 nextPosition = Position + Velocity; List bodiesToCheck = World.QuadTree.Query(new Rect(Position.X, Position.Y, Width + (Width * 3), Height + (Height * 3))); 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 nextH = 0, nextV = 0; bool overlap = false; if (true) { if (SSSPUtils.IsOverlapping(this, body, nextPosition.X - Position.X)) { overlap = true; int left = (body.CornerMin.X - (nextPosition.X + Width / 2)); int right = (body.CornerMax.X - (nextPosition.X - Width / 2)); nextH = Math.Abs(left) < right ? left : right; if (!(body.CollisionGroups.Any(IgnoreCollisionResolveGroups.Contains)) && InvokeOnResolve(body, new SSSPVector2(nextH, 0))) { nextPosition.X += nextH; if (Math.Abs(left) < right) { if (Velocity.X > 0) Velocity = new SSSPVector2(0, Velocity.Y); IsCollidingOnLeft = true; } else { if (Velocity.X < 0) Velocity = new SSSPVector2(0, Velocity.Y); IsCollidingOnRight = true; } } } if (SSSPUtils.IsOverlapping(this, body, 0, nextPosition.Y - Position.Y)) { overlap = true; int top = (body.CornerMin.Y - (nextPosition.Y + Height / 2)); int bottom = (body.CornerMax.Y - (nextPosition.Y - Height / 2)); nextV = Math.Abs(top) < bottom ? top : bottom; if (!(body.CollisionGroups.Any(IgnoreCollisionResolveGroups.Contains)) && InvokeOnResolve(body, new SSSPVector2(0, nextV))) { nextPosition.Y += nextV; if (Math.Abs(top) < bottom) { if (Velocity.Y > 0) Velocity = new SSSPVector2(Velocity.X, 0); IsCollidingOnTop = true; } else { if (Velocity.Y < 0) Velocity = new SSSPVector2(Velocity.X, 0); IsCollidingOnBottom = true; } } } } if (overlap) invokations.Add(new object[] { body, nextH, nextV }); } foreach (object[] objects in invokations) { InvokeOnOverlap((SSSPBody)objects[0], (int)objects[1], (int)objects[2]); SSSPBody b = (SSSPBody)objects[0]; b.InvokeOnOverlap(this, (int)objects[1] * -1, (int)objects[2] * -1); } Position = nextPosition; InvokeBoundsChanged(new EventArgs()); } --- public static bool IsOverlapping(SSSPBody mBody1, SSSPBody mBody2, int mOffsetX = 0, int mOffsetY = 0) { return mBody1.CornerMax.X + mOffsetX > mBody2.CornerMin.X && mBody1.CornerMin.X + mOffsetX < mBody2.CornerMax.X && (mBody1.CornerMax.Y + mOffsetY > mBody2.CornerMin.Y && mBody1.CornerMin.Y + mOffsetY < mBody2.CornerMax.Y); }