示例#1
0
        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);
            }
        }