aboutsummaryrefslogtreecommitdiff
path: root/src/games/pong/Pong.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/games/pong/Pong.cpp')
-rw-r--r--src/games/pong/Pong.cpp140
1 files changed, 140 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);
+}
+