diff --git a/pong/src/main.cpp b/pong/src/main.cpp index 0f12e70..420e8ae 100644 --- a/pong/src/main.cpp +++ b/pong/src/main.cpp @@ -120,22 +120,48 @@ int main() player.y += 2 * right_encoder_delta; float diff = ball.middle_v() - ai.middle_v(); - ai.y += 1.4f * diff * dt; + ai.y += 1.6f * diff * dt; ball.x += ball_dx * dt * ball_speed; ball.y += ball_dy * dt * ball_speed; - if (ball.overlaps(player)) + const rect player_top = { player.left(), player.top(), player.w - 2, 1 }; + const rect player_bottom = { player.left(), player.bottom() - 1, player.w - 2, 1 }; + if (ball.overlaps(player_top) || ball.overlaps(player_bottom)) + { + ball_dy = -ball_dy; + } + else if (ball.overlaps(player)) { ball_dx = -ball_dx; ball.x = player.right(); ball_speed += 1.0f; + + float angle = atan2f(ball_dy, ball_dx); + float angle_delta = (ball.middle_v() - player.middle_v()) / 30.0f; + + ball_dx = cosf(angle + angle_delta); + ball_dy = sinf(angle + angle_delta); } - if (ball.overlaps(ai)) + + const rect ai_top = { ai.left() + 2, ai.top(), ai.w - 2, 1 }; + const rect ai_bottom = { ai.left() + 2, ai.bottom() - 1, ai.w - 2, 1 }; + if (ball.overlaps(ai_top) || ball.overlaps(ai_bottom)) + { + ball_dy = -ball_dy; + } + else if (ball.overlaps(ai)) { ball_dx = -ball_dx; ball.x = ai.left() - ball.w; ball_speed += 1.0f; + + float angle = atan2f(ball_dy, ball_dx); + // ball second since the paddle is facing the other way + float angle_delta = (ai.middle_v() - ball.middle_v()) / 30.0f; + + ball_dx = cosf(angle + angle_delta); + ball_dy = sinf(angle + angle_delta); } if (ball.left() < 0)