Instead of trying to keep your fps constant(which is not what's happening) you should move your paddle in proportion to the frame time.
Some problems I saw by glancing over your code:
- You're frames per second calculation calculates the average fps for the entire duration of the game, you probably want to reset your frames counter when at least a second has passed. To correctly estimate the fps, you should divide your frames by currentTime - lastTime.
- Your condition to call SDL_Delay is always true, SDL_GetTicks() - currenTime will practically always be 0.
- 1000 / MAX_FRAMES will result in an integer instead of a float, resulting in 16 instead of 16.66.., this is a significant loss of accuracy.
- Don't use the #define preprocessor to define constants, use const values instead.
Keeping fps constant is not easy if not impossible and what happens when a device can't make it past 30 fps? Your game will run at half the speed.
In order to move the paddles and the ball at constant speeds on varying frame rates you simply multiply the movement by the delta frame time(time difference between current and previous frame).
There is another thing you need to be aware of, most timers aren't nearly as accurate as you might think. Depending on your frame rate and the accuracy of the timer, you might not be able to detect a difference in time between two frames, i.e. delta time becomes 0. I'm not familiar with SDL so I don't know how accurate SDL_GetTicks() is(a quick search indicates it's about a millisecond), so you might have to use a more accurate timer.