public void Remove(ICircleCollider collider)
        {
            var wrapper = _wrapperDictionary[collider];

            wrapper.SetRemove();
            _wrapperDictionary.Remove(collider);
        }
        public static CircleCollisionInfo CircleCheck_Rectangle(Rectangle rect, ICircleCollider collider)
        {
            var info = Distance2D.RectangleToPoint(rect, collider.GetColliderCenter());

            info.Distance -= collider.GetColliderRadius();
            return(new CircleCollisionInfo(collider, info));
        }
        public void Add(ICircleCollider collider)
        {
            var wrapper = new ColliderWrapper(collider);

            Data.Add(wrapper);
            _wrapperDictionary.Add(collider, wrapper);
        }
        public CircleCollisionInfo(ICircleCollider collider, DistanceInfo2D distanceInfo)
        {
            Collider    = collider;
            HitPosition = CalcHitPosition(distanceInfo);

            UpdateDistance(distanceInfo.Distance);
            UpdateAngle(distanceInfo.Angle);
        }
Example #5
0
        public static bool IsCollidingWith(this ICircleCollider circle1, ICircleCollider circle2)
        {
            var diff       = circle2.Center - circle1.Center;
            var radiiSq    = (circle2.Radius + circle1.Radius) * (circle2.Radius + circle1.Radius);
            var distanceSq = diff.LengthSquared();

            return(distanceSq < (radiiSq));
        }
Example #6
0
            public static int GetZOrder(ICircleCollider collider, CircleCollisionSetting setting)
            {
                Rectangle rect   = setting.GetAreaRectangle();
                int       zorder = 0;

                for (int i = 0; i < setting.Depth; i++)
                {
                    bool isCircleBigger = rect.Width <= collider.GetColliderRadius() * 2;
                    bool isDepthMax     = i == setting.Depth - 1;

                    if (isCircleBigger || isDepthMax)
                    {
                        break;
                    }

                    Vector2 toCircle   = collider.GetColliderCenter() - rect.Position;
                    Vector2 nextCenter = rect.Position - rect.Size / 4;

                    zorder *= 4;
                    zorder += 1;
                    if (toCircle.x >= 0)
                    {
                        zorder       += 1;
                        nextCenter.x += rect.Width / 2;
                    }
                    if (toCircle.y >= 0)
                    {
                        zorder       += 2;
                        nextCenter.y += rect.Height / 2;
                    }

                    rect.Position = nextCenter;
                    rect.Size    /= 2;
                }

                return(zorder);
            }
Example #7
0
 public abstract CircleCollisionInfo CircleCollision_ColliderCheck(ICircleCollider circleCollider);
Example #8
0
 public void RemoveCollider(ICircleCollider collider)
 {
     Data.Remove(collider);
 }
Example #9
0
 public void AddCollider(ICircleCollider collider)
 {
     Data.Add(collider);
 }
        public override CircleCollisionInfo CircleCollision_ColliderCheck(ICircleCollider circleCollider)
        {
            if (DontCheckCollision == true)
            {
                return(new CircleCollisionInfo(circleCollider, new DistanceInfo2D(float.PositiveInfinity, 0)));
            }

            var rect        = Rectangle;
            var size        = Rectangle.Size;
            var center      = circleCollider.GetColliderCenter();
            var radius      = circleCollider.GetColliderRadius();
            int arrayWidth  = EnableArray.GetLength(1);
            int arrayHeight = EnableArray.GetLength(0);

            var info = new BreakoutBlockCollisionInfo(circleCollider);

            float sinr = Mathf.Sin(rect.Rotation);
            float cosr = Mathf.Cos(rect.Rotation);

            var cx = center.x - rect.Position.x + (cosr * rect.Size.x - sinr * rect.Size.y) * 0.5f;
            var cy = center.y - rect.Position.y + (sinr * rect.Size.x + cosr * rect.Size.y) * 0.5f;

            var scalex = arrayWidth / size.x;
            var scaley = arrayHeight / size.y;

            var tx = (cosr * cx + sinr * cy) * scalex;
            var ty = (-sinr * cx + cosr * cy) * scaley;

            var radx = radius * scalex;
            var rady = radius * scaley;

            int stx = Mathf.Max(0, (int)Mathf.Floor(tx - radx));
            int sty = Mathf.Max(0, (int)Mathf.Floor(ty - rady));

            int enx = Mathf.Min(arrayWidth, (int)Mathf.Ceil(tx + radx));
            int eny = Mathf.Min(arrayHeight, (int)Mathf.Ceil(ty + rady));

            for (int i = sty; i < eny; i++)
            {
                for (int j = stx; j < enx; j++)
                {
                    if (EnableArray[i, j] == false)
                    {
                        continue;
                    }

                    float dx = tx - j;
                    float dy = ty - i;

                    float distx = (dx <= 0 ? -dx : dx - 1) / scalex;
                    float disty = (dy <= 0 ? -dy : dy - 1) / scaley;

                    bool rev = distx < 0 && disty < 0;
                    if (rev)
                    {
                        if (distx < disty)
                        {
                            distx = 0;
                        }
                        else
                        {
                            disty = 0;
                        }
                    }
                    else
                    {
                        distx = Mathf.Max(0, distx);
                        disty = Mathf.Max(0, disty);
                    }

                    float distance = Mathf.Sqrt(distx * distx + disty * disty) * (rev ? -1 : 1);
                    float angle    = Mathf.Atan2(
                        -disty * Mathf.Sign(dy - 0.5f) * Mathf.Sign(distance),
                        -distx * Mathf.Sign(dx - 0.5f) * Mathf.Sign(distance));

                    info.MergeInfo(new DistanceInfo2D(distance - radius, angle), j, i);
                }
            }

            return(info);
        }
 public ColliderWrapper(ICircleCollider collider)
 {
     Collider = collider;
 }
 public GridInfo(ICircleCollider collider, DistanceInfo2D distanceInfo, int arrayX, int arrayY)
 {
     Collision = new CircleCollisionInfo(collider, distanceInfo);
     ArrayX    = arrayX;
     ArrayY    = arrayY;
 }
 public BreakoutBlockCollisionInfo(ICircleCollider collider)
     : base(collider, new DistanceInfo2D(float.PositiveInfinity, 0))
 {
     GridData = new List <GridInfo>();
 }