#include "games/pong/Pong.hpp" #include "games/Game.hpp" #include "common/shapes.hpp" #include "renderer/Renderer.hpp" void Pong::Start() { m_paddles[0].dir = NONE; m_paddles[0].y = 1.5f; m_paddles[1].dir = NONE; m_paddles[1].y = 1.5f; m_ball.circle.x = 2.0f; m_ball.circle.y = 1.5f; m_ball.circle.r = 0.1f; m_ball.velocity.x = 1.0f; m_ball.velocity.y = 0.0f; m_game_status = game_resume; } void Pong::ProcessEvent(SDL_Event& event) { switch (event.type) { case SDL_EVENT_KEY_DOWN: { auto key = event.key.key; if (key == SDLK_ESCAPE) { m_game_status = game_pause; } else if (key == SDLK_W) { m_paddles[0].dir = UP; } else if (key == SDLK_S) { m_paddles[0].dir = DOWN; } else if (key == SDLK_UP) { m_paddles[1].dir = UP; } else if (key == SDLK_DOWN) { m_paddles[1].dir = DOWN; } } break; case SDL_EVENT_KEY_UP: { auto key = event.key.key; if (key == SDLK_W && m_paddles[0].dir == UP) { m_paddles[0].dir = NONE; } else if (key == SDLK_S && m_paddles[0].dir == DOWN) { m_paddles[0].dir = NONE; } else if (key == SDLK_UP && m_paddles[1].dir == UP) { m_paddles[1].dir = NONE; } else if (key == SDLK_DOWN && m_paddles[1].dir == DOWN) { m_paddles[1].dir = NONE; } } break; default:; } } void Pong::FinishUpdate(float dt) { MoveBall(dt); MovePaddle(m_paddles[0], dt); MovePaddle(m_paddles[1], dt); } void Pong::MovePaddle(Paddle& paddle, float dt) { if (paddle.dir) { paddle.y += (float)paddle.dir * (PADDLE_SPEED * dt); } if (paddle.y <= 0.0f) { paddle.y = 0.0f; } if (paddle.y + PADDLE_HEIGHT > 3.0f) { paddle.y = 3.0f - PADDLE_HEIGHT; } } void Pong::MoveBall(float dt) { // Todo: do physics! find trajectories, find intersection, bounce off properly m_ball.circle.x += m_ball.velocity.x * dt; m_ball.circle.y += m_ball.velocity.y * dt; if (m_ball.circle.x - m_ball.circle.r <= PADDLE_WIDTH) { m_ball.circle.x = PADDLE_WIDTH + m_ball.circle.r; m_ball.velocity.x *= -1.0f; m_ball.velocity.y *= -1.0f; } if (m_ball.circle.x + m_ball.circle.r > 4.0f - PADDLE_WIDTH) { m_ball.circle.x = 4.0f - PADDLE_WIDTH - m_ball.circle.r; m_ball.velocity.x *= -1.0f; m_ball.velocity.y *= -1.0f; } } void Pong::Draw() { Color paddle_color = {0.6f, 0.3f, 0.3f, 1.0f}; Rectangle paddle1_rect = { 0.0f, m_paddles[0].y, 0.0f + PADDLE_WIDTH, m_paddles[0].y + PADDLE_HEIGHT }; Rectangle paddle2_rect = { 4.0f - PADDLE_WIDTH, m_paddles[1].y, 4.0f, m_paddles[1].y + PADDLE_HEIGHT }; g_renderer.PushRectangle(paddle1_rect, paddle_color, z_layer1); g_renderer.PushRectangle(paddle2_rect, paddle_color, z_layer1); // Todo: draw a circle Rectangle ball_rectangle = { m_ball.circle.x - m_ball.circle.r, m_ball.circle.y - m_ball.circle.r, m_ball.circle.x + m_ball.circle.r, m_ball.circle.y + m_ball.circle.r }; Color ball_color = {0.3f, 0.5f, 0.3f, 1.0f}; g_renderer.PushRectangle(ball_rectangle, ball_color, z_layer1); }