So my main issue when programming a game of pong is the ball reflection when it collides with the player or AI paddle. When I first made a pong game I just gave the ball's yvel a random value between -1 and 1 and just flipped the sign on the xvel when it struck the paddle but that is horrendously boring. The player needs some sort of control over the ball and I was going for the kind that when the ball strikes the paddle it is reflected in the direction based on where it struck the paddle.
There were a few ways I was going to go about this, the most simple seemed to split the paddle into a few sections. When the ball and paddle collide check how far down the middle of the ball hit the paddle and give the ball a preset yvel based on where it hit. Closer to the edges gave it a larger value and closer to the center made the yvel close into 0. This of course would go for beneath the center and would make the ball head downward.
However I thought there was a better way to do this. What I tried to do ended of working with some glitches. I would take the amount of pixel difference between the center of the ball and where it hit the paddle and made that into a reasonable yvel value. Its hard to explain so I will include code that I used which is in C++ SFML.
// Ball/Paddle Collision
else if(sBall.getPosition().x <= 30 &&
sBall.getPosition().y + BALLHEIGHT >= sPaddle.getPosition().y &&
sBall.getPosition().y <= sPaddle.getPosition().y + PADDLEHEIGHT)
{
bpdelta = (sBall.getPosition().y + BALLHEIGHT) - sPaddle.getPosition().y;
std::cout << "BPDelta: " << bpdelta << std::endl;
ballvelx = ballvelx * -1;
if(bpdelta < 60)
{
ballvely = 1 / (bpdelta / 10);
std::cout << "Delta <= 60" << std::endl;
std::cout << ballvely << std::endl;
if(ballvely > 0)
ballvely = ballvely + -1;
}
else if (bpdelta > 60)
{
bpdelta = bpdelta - 60;
ballvely = bpdelta / 100;
std::cout << "Delta > 60" << std::endl;
std::cout << ballvely << std::endl;
}
else
ballvely = 0;
}
These are just things that I tried to do without copying anyone elses work, what I want to know is what is the easiest and proper way to do this. I am currently not concerned by spin with how fast the paddle was moving when striking the ball, thanks and sorry for the wall of text