Exemple #1
0
        public static bool CheckCollision(CircleCollider h1, CircleCollider h2)
        {
            var h1Position = h1.GetPosition();
            var h2Position = h2.GetPosition();

            return(Math.Pow((h1Position.X - h2Position.X), 2) + Math.Pow((h1Position.Y - h2Position.Y), 2) < Math.Pow((h1.Radius + h2.Radius), 2));
        }
Exemple #2
0
        private static void ResolveCollision(CircleCollider c1, BoxCollider c2)
        {
            float pointX = MathHelper.Clamp(
                c1.GetPosition().X,
                c2.GetPosition().X - c2.width / 2,
                c2.GetPosition().X + c2.width / 2);

            float pointY = MathHelper.Clamp(
                c1.GetPosition().Y,
                c2.GetPosition().Y - c2.height / 2,
                c2.GetPosition().Y + c2.height / 2);

            Vector2 point = new Vector2(pointX, pointY);

            // hacki soł macz
            tempGO.transform.position = point;
            tempCC.SetReaction(c2.GetReaction());
            ResolveCollision(c1, tempCC);
        }
Exemple #3
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);
            }
        }