private static void ResolveCollision(CircleCollider c1, CircleCollider c2) { if (GetDistanceBetween(c1, c2) < c1.radius + c2.radius) { if (IsBlocking(c1, c2)) { Direction direction = CheckDirection(c1, c2); switch (direction) { case Direction.LEFT: { float c = c1.radius + c2.radius; float x = (float)Math.Sqrt(Math.Pow(c, 2) - Math.Pow(GetAbsolutePositionDifference(c1, c2).Y, 2)); c1.SetPosition(new Vector2(c2.GetPosition().X - x, c1.GetPosition().Y)); break; } case Direction.RIGHT: { float c = c1.radius + c2.radius; float x = (float)Math.Sqrt(Math.Pow(c, 2) - Math.Pow(GetAbsolutePositionDifference(c1, c2).Y, 2)); c1.SetPosition(new Vector2(c2.GetPosition().X + x, c1.GetPosition().Y)); break; } case Direction.UP: { float c = c1.radius + c2.radius; float y = (float)Math.Sqrt(Math.Pow(c, 2) - Math.Pow(GetAbsolutePositionDifference(c1, c2).X, 2)); c1.SetPosition(new Vector2(c1.GetPosition().X, c2.GetPosition().Y - y)); break; } case Direction.DOWN: { float c = c1.radius + c2.radius; float y = (float)Math.Sqrt(Math.Pow(c, 2) - Math.Pow(GetAbsolutePositionDifference(c1, c2).X, 2)); c1.SetPosition(new Vector2(c1.GetPosition().X, c2.GetPosition().Y + y)); break; } } // Blocking events ColliderEvents.Add(new ColliderEventInfo(c1, c2, ColliderEventType.Block)); //c1.OnBlockDetected(c2); //c2.OnBlockDetected(c1); } if (IsOverlaping(c1, c2)) { ColliderEvents.Add(new ColliderEventInfo(c1, c2, ColliderEventType.BeginOverlap)); //c1.RunOnBeginOverlap(c2); //c2.RunOnBeginOverlap(c1); } } else // jeżeli nie koliduje { ColliderEvents.Add(new ColliderEventInfo(c1, c2, ColliderEventType.EndOverlap)); //if(c1.collisons.Contains(c2)) // c1.RunOnEndOverlap(c2); //if(c2.collisons.Contains(c1)) // c2.RunOnEndOverlap(c1); } }