The ball might be getting stuck to the floor because hitWall reverses the ball velocity whenever the ball is out of bounds, even if it was out of bounds in the previous time tick. If the ball doesn't bounce all the way back into the viewport in one time tick, hitWall could reverse direction again, pushing the ball farther out of bounds.
Maybe hitWall could only reverse direction if the ball is out of bounds and if the current velocity is carrying it farther out of bounds. If the ball is out of bounds, but is heading back in bounds, there's no need to reverse the velocity.
Going to a higher order Runge-Kutta simulation is the best way to get more accurate motion, but swapping the position update and call to hitWall might help some. Right now, the code updates velocity, updates position, then updates velocity again. It would be cleaner to do both velocity updates before the position update.
Three colors, endless fun ...
Primary Attack