diff options
Diffstat (limited to 'src/games/pong')
| -rw-r--r-- | src/games/pong/Pong.cpp | 140 | ||||
| -rw-r--r-- | src/games/pong/Pong.hpp | 42 |
2 files changed, 182 insertions, 0 deletions
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); +} + diff --git a/src/games/pong/Pong.hpp b/src/games/pong/Pong.hpp new file mode 100644 index 0000000..ec6145b --- /dev/null +++ b/src/games/pong/Pong.hpp @@ -0,0 +1,42 @@ +#pragma once + +#include "games/Game.hpp" +#include "common/shapes.hpp" + + +class Pong : public Game { + enum PaddleDirection { + NONE = 0, + UP = 1, + DOWN = -1 + }; + + struct Paddle { + float y; + PaddleDirection dir; + }; + + struct Ball { + Circle circle; + V2F32 velocity; + }; + + static constexpr float PADDLE_HEIGHT = 0.5f; + static constexpr float PADDLE_WIDTH = 0.2f; + static constexpr float PADDLE_SPEED = 1.0f; + +private: + void Start() override; + void ProcessEvent(SDL_Event& event) override; + void FinishUpdate(float dt) override; + void Draw() override; + +private: + void MovePaddle(Paddle& paddle, float dt); + void MoveBall(float dt); + +private: + Paddle m_paddles[2]; + Ball m_ball; +}; + |
