예제 #1
0
        public void DistributeCircle_Box(LSBody box, LSBody circle)
        {
            xMore = circle._position.x > box._position.x;
            yMore = circle._position.y > box._position.y;

            if (xMore)
            {
                PenetrationX = (circle.XMin - box.XMax);
            }
            else
            {
                PenetrationX = (circle.XMax - box.XMin);
            }
            if (yMore)
            {
                PenetrationY = (circle.YMin - box.YMax);
            }
            else
            {
                PenetrationY = (circle.YMax - box.YMin);
            }

            //PenetrationX = PenetrationX + circle.Velocity.x;
            //PenetrationY = PenetrationY + circle.Velocity.y;
            xAbs = PenetrationX < 0 ? -PenetrationX : PenetrationX;
            yAbs = PenetrationY < 0 ? -PenetrationY : PenetrationY;

            if ((xAbs <= circle.Radius && yAbs <= circle.Radius))
            {
                Vector2d corner;
                corner.x = xMore ? box.Position.x + box.HalfWidth : box.Position.x - box.HalfWidth;
                corner.y = yMore ? box.Position.y + box.HalfHeight : box.Position.y - box.HalfHeight;
                Vector2d dir = circle.Position - corner;
                dir.Normalize();

                circle.Position = corner + dir * circle.Radius;
            }
            else
            {
                if (xAbs > yAbs)
                {
                    PenetrationX = 0;
                    //if (yAbs < circle.Radius) PenetrationY = PenetrationY * yAbs / circle.Radius;
                }
                else
                {
                    PenetrationY = 0;
                    //if (xAbs < circle.Radius) PenetrationX = PenetrationX * xAbs / circle.Radius;
                }
                //Resolving
                circle._position.x -= PenetrationX;
                circle._position.y -= PenetrationY;
            }



            circle.PositionChanged = true;
            circle.BuildBounds();
        }
예제 #2
0
        public void DistributeCircle_Box(LSBody box, LSBody circle)
        {
            xMore = circle._position.x > box._position.x;
            yMore = circle._position.y > box._position.y;

            if (xMore)
            {
                PenetrationX = (circle.XMin - box.XMax);
            }
            else
            {
                PenetrationX = (circle.XMax - box.XMin);
            }
            if (yMore)
            {
                PenetrationY = (circle.YMin - box.YMax);
            }
            else
            {
                PenetrationY = (circle.YMax - box.YMin);
            }


            xAbs = PenetrationX < 0 ? -PenetrationX : PenetrationX;
            yAbs = PenetrationY < 0 ? -PenetrationY : PenetrationY;
            if (xAbs <= circle.Radius && yAbs <= circle.Radius)
            {
            }
            else
            {
                if (xAbs > yAbs)
                {
                    PenetrationX = 0;//FixedMath.Mul (PenetrationX, FixedMath.One * 1 / 4);
                }
                else
                {
                    PenetrationY = 0;//FixedMath.Mul (PenetrationX, FixedMath.One * 1 / 4);
                }
            }
            //Resolving
            circle._position.x -= PenetrationX; //(PenetrationX * Multiplier) >> FixedMath.SHIFT_AMOUNT;
            circle._position.y -= PenetrationY; //(PenetrationY * Multiplier) >> FixedMath.SHIFT_AMOUNT;

            circle.PositionChanged = true;
            circle.BuildBounds();
        }
예제 #3
0
        public void DistributeCircle_Box(LSBody box, LSBody circle)
        {
            xMore = circle.Position.x > box.Position.x;
            yMore = circle.Position.y > box.Position.y;

            if (xMore) {
                PenetrationX = (circle.XMin - box.XMax);
            } else {
                PenetrationX = (circle.XMax - box.XMin);
            }
            if (yMore) {
                PenetrationY = (circle.YMin - box.YMax);
            } else {
                PenetrationY = (circle.YMax - box.YMin);
            }

            xAbs = PenetrationX < 0 ? -PenetrationX : PenetrationX;
            yAbs = PenetrationY < 0 ? -PenetrationY : PenetrationY;
            if (xAbs > yAbs) {
                PenetrationX = 0;//FixedMath.Mul (PenetrationX, FixedMath.One * 1 / 4);
            } else {
                PenetrationY = 0;//FixedMath.Mul (PenetrationX, FixedMath.One * 1 / 4);
            }

            //Resolving
            circle.Position.x -= PenetrationX;//(PenetrationX * Multiplier) >> FixedMath.SHIFT_AMOUNT;
            circle.Position.y -= PenetrationY;//(PenetrationY * Multiplier) >> FixedMath.SHIFT_AMOUNT;
            circle.Velocity.x -= PenetrationX;
            circle.Velocity.y -= PenetrationY;
            circle.VelocityChanged = true;
            circle.PositionChanged = true;
            circle.BuildBounds ();
        }
예제 #4
0
        public void DistributeCircle_Box(LSBody box, LSBody circle)
        {
            xMore = circle.Position.x > box.Position.x;
            yMore = circle.Position.y > box.Position.y;

            if (xMore)
            {
                PenetrationX = (circle.XMin - box.XMax);
                if (PenetrationX > 0)
                {
                    PenetrationX = 0;
                }
            }
            else
            {
                PenetrationX = (circle.XMax - box.XMin);
                if (PenetrationX < 0)
                {
                    PenetrationX = 0;
                }
            }
            if (yMore)
            {
                PenetrationY = (circle.YMin - box.YMax);
                if (PenetrationY > 0)
                {
                    PenetrationY = 0;
                }
            }
            else
            {
                PenetrationY = (circle.YMax - box.YMin);
                if (PenetrationY < 0)
                {
                    PenetrationY = 0;
                }
            }


            xAbs = PenetrationX < 0 ? -PenetrationX : PenetrationX;
            yAbs = PenetrationY < 0 ? -PenetrationY : PenetrationY;
            if (xAbs > yAbs)
            {
                PenetrationX = 0;
            }
            else
            {
                PenetrationY = 0;
            }

            //Resolving
            if (Vector2d.Dot(PenetrationX, PenetrationY, circle.Velocity.x, circle.Velocity.y) < 0)
            {
                return;
            }

            circle.Position.x -= PenetrationX;            //(PenetrationX * Multiplier) >> FixedMath.SHIFT_AMOUNT;
            circle.Position.y -= PenetrationY;            //(PenetrationY * Multiplier) >> FixedMath.SHIFT_AMOUNT;

            if (LeCollisionType != CollisionType.Circle_AABox)
            {
                Mag          = FixedMath.Sqrt((PenetrationX * PenetrationX + PenetrationY * PenetrationY) >> FixedMath.SHIFT_AMOUNT);
                PenetrationX = (PenetrationX << FixedMath.SHIFT_AMOUNT) / Mag;
                PenetrationY = (PenetrationY << FixedMath.SHIFT_AMOUNT) / Mag;
            }
            else
            {
                if (PenetrationX != 0)
                {
                    PenetrationX = PenetrationX > 0 ? FixedMath.One : -FixedMath.One;
                }
                else if (PenetrationY != 0)
                {
                    PenetrationY = PenetrationY > 0 ? FixedMath.One : -FixedMath.One;
                }
            }

            circle.PositionChanged = true;
            circle.BuildBounds();
        }
        public void DistributeCircle_Box(LSBody box, LSBody circle)
        {
            xMore = circle.Position.x > box.Position.x;
            yMore = circle.Position.y > box.Position.y;

            if (xMore) {
                PenetrationX = (circle.XMin - box.XMax);
                if (PenetrationX > 0)
                    PenetrationX = 0;
            } else {
                PenetrationX = (circle.XMax - box.XMin);
                if (PenetrationX < 0)
                    PenetrationX = 0;
            }
            if (yMore) {
                PenetrationY = (circle.YMin - box.YMax);
                if (PenetrationY > 0)
                    PenetrationY = 0;
            } else {
                PenetrationY = (circle.YMax - box.YMin);
                if (PenetrationY < 0)
                    PenetrationY = 0;
            }

            xAbs = PenetrationX < 0 ? -PenetrationX : PenetrationX;
            yAbs = PenetrationY < 0 ? -PenetrationY : PenetrationY;
            if (xAbs > yAbs) {
                PenetrationX = 0;
            } else {
                PenetrationY = 0;
            }

            //Resolving
            if (Vector2d.Dot (PenetrationX,PenetrationY,circle.Velocity.x,circle.Velocity.y) < 0)
            {
                return;
            }

            circle.Position.x -= PenetrationX;//(PenetrationX * Multiplier) >> FixedMath.SHIFT_AMOUNT;
            circle.Position.y -= PenetrationY;//(PenetrationY * Multiplier) >> FixedMath.SHIFT_AMOUNT;

            if (LeCollisionType != CollisionType.Circle_AABox)
            {
                Mag = FixedMath.Sqrt ((PenetrationX * PenetrationX + PenetrationY * PenetrationY) >> FixedMath.SHIFT_AMOUNT);
                PenetrationX = (PenetrationX << FixedMath.SHIFT_AMOUNT) / Mag;
                PenetrationY = (PenetrationY << FixedMath.SHIFT_AMOUNT) / Mag;
            }
            else {
                if (PenetrationX != 0){
                    PenetrationX = PenetrationX > 0 ? FixedMath.One : -FixedMath.One;
                }
                else if (PenetrationY != 0)
                {
                    PenetrationY = PenetrationY > 0 ? FixedMath.One : -FixedMath.One;
                }
            }

            circle.PositionChanged = true;
            circle.BuildBounds ();
        }