From 6fffbbed46b903223f752faee7bbb870557665c9 Mon Sep 17 00:00:00 2001 From: fschildt Date: Thu, 11 Dec 2025 02:26:56 +0100 Subject: refactor Game.hpp, add unfinished pong --- src/games/pong/Pong.cpp | 140 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 src/games/pong/Pong.cpp (limited to 'src/games/pong/Pong.cpp') diff --git a/src/games/pong/Pong.cpp b/src/games/pong/Pong.cpp new file mode 100644 index 0000000..9a77f38 --- /dev/null +++ b/src/games/pong/Pong.cpp @@ -0,0 +1,140 @@ +#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); +} + -- cgit v1.2.3