public static Velocity collisionWithSlip(BasicSprite s1, BasicSprite s2)
        {
            if (willCollide(s1, s2))
            {
                s1.onCollide(s2);
                s2.onCollide(s1);
                if (s1.collidable && s2.collidable)
                {
                    float     vf1, vf2;
                    Velocity  v1        = Velocity.FromCoordinates(s1.velocity.getDirection().X, 0.0f);
                    Velocity  v2        = Velocity.FromCoordinates(s2.velocity.getDirection().X, 0.0f);
                    Rectangle collision = Rectangle.Intersect(new Rectangle(s1.getUpdatePositionFromVelocity(v1).ToPoint(), s1.spriteSize), new Rectangle(s2.getUpdatePositionFromVelocity(v2).ToPoint(), s2.spriteSize));
                    if (collision != Rectangle.Empty)
                    {
                        vf1 = (int)v1.getDirection().X + (Math.Sign(v1.getDirection().X) * -collision.Width);
                    }
                    else
                    {
                        vf1 = v1.getDirection().X;
                    }

                    v1        = Velocity.FromCoordinates(0.0f, s1.velocity.getDirection().Y);
                    v2        = Velocity.FromCoordinates(0.0f, s2.velocity.getDirection().Y);
                    collision = Rectangle.Intersect(new Rectangle(s1.getUpdatePositionFromVelocity(v1).ToPoint(), s1.spriteSize), new Rectangle(s2.getUpdatePositionFromVelocity(v2).ToPoint(), s2.spriteSize));
                    if (collision != Rectangle.Empty)
                    {
                        vf2 = (int)v1.getDirection().Y + (Math.Sign(v1.getDirection().Y) * -collision.Height);
                    }
                    else
                    {
                        vf2 = v1.getDirection().Y;
                    }

                    return(Velocity.FromCoordinates(vf1, vf2));
                }
                else
                {
                    return(s1.velocity);
                }
            }
            else
            {
                return(s1.velocity);
            }
        }
        public static Velocity collisionWithSlip(BasicSprite s1, BasicSprite s2, GameTime time)
        {
            if (s1.collidable && s2.collidable)
            {
                double vfx, vfy;
                Velocity v1 = Velocity.FromCoordinates(s1.velocity.getX(), 0.0f);
                Velocity v2 = Velocity.FromCoordinates(s2.velocity.getX(), 0.0f);
                Rectangle collision = Rectangle.Intersect(new Rectangle(s1.getUpdatePositionFromVelocity(v1).ToPoint(), s1.spriteSize), new Rectangle(s2.getUpdatePositionFromVelocity(v2).ToPoint(), s2.spriteSize));
                if (collision != Rectangle.Empty)
                    vfx =  v1.getX() - collision.Width * Math.Sign(v1.getX());
                else
                    vfx = v1.getX();

                if (Math.Abs(vfx) < 1.0f)
                    vfx = 0.0f;

                data.X = collision.X;
                data.Width = (Math.Sign(v1.getX())) * collision.Width;

                v1 = Velocity.FromCoordinates((float)vfx, s1.velocity.getY());
                v2 = Velocity.FromCoordinates((float)vfx, s2.velocity.getY());

                collision = Rectangle.Intersect(new Rectangle(s1.getUpdatePositionFromVelocity(v1).ToPoint(), s1.spriteSize), new Rectangle(s2.getUpdatePositionFromVelocity(v2).ToPoint(), s2.spriteSize));
                if (collision != Rectangle.Empty)
                    vfy = v1.getY() - (collision.Height * Math.Sign(v1.getY()));
                else
                    vfy = v1.getY();

                if (Math.Abs(vfy) < 1.0f) // stupid floats
                    vfy = 0.0f;

                data.Y = collision.Y;
                data.Height = Math.Sign(v1.getY()) * collision.Height;

                return Velocity.FromCoordinates((float)vfx, (float)vfy);
            }
            else
            {
                return s1.velocity;
            }
        }
        public static Velocity collisionWithSlip(BasicSprite s1, BasicSprite s2)
        {
            if (willCollide(s1, s2))
            {
                s1.onCollide(s2);
                s2.onCollide(s1);
                if (s1.collidable && s2.collidable)
                {
                    float vf1, vf2;
                    Velocity v1 = Velocity.FromCoordinates(s1.velocity.getDirection().X, 0.0f);
                    Velocity v2 = Velocity.FromCoordinates(s2.velocity.getDirection().X, 0.0f);
                    Rectangle collision = Rectangle.Intersect(new Rectangle(s1.getUpdatePositionFromVelocity(v1).ToPoint(), s1.spriteSize), new Rectangle(s2.getUpdatePositionFromVelocity(v2).ToPoint(), s2.spriteSize));
                    if (collision != Rectangle.Empty)
                        vf1 = (int)v1.getDirection().X + (Math.Sign(v1.getDirection().X) * -collision.Width);
                    else
                        vf1 = v1.getDirection().X;

                    v1 = Velocity.FromCoordinates(0.0f, s1.velocity.getDirection().Y);
                    v2 = Velocity.FromCoordinates(0.0f, s2.velocity.getDirection().Y);
                    collision = Rectangle.Intersect(new Rectangle(s1.getUpdatePositionFromVelocity(v1).ToPoint(), s1.spriteSize), new Rectangle(s2.getUpdatePositionFromVelocity(v2).ToPoint(), s2.spriteSize));
                    if (collision != Rectangle.Empty)
                        vf2 = (int)v1.getDirection().Y + (Math.Sign(v1.getDirection().Y) * -collision.Height);
                    else
                        vf2 = v1.getDirection().Y;

                    return Velocity.FromCoordinates(vf1, vf2);
                }
                else
                {
                    return s1.velocity;
                }
            } else
            {
                return s1.velocity;
            }
        }