From 860d8febe61888026aadaa0da954f5a6fa5397b7f74d8fb1f89bab4c963d435d Mon Sep 17 00:00:00 2001 From: Arotex Date: Sun, 12 Oct 2025 19:40:12 +0200 Subject: [PATCH] Start trying own game --- Capter1/Game.cpp | 245 ++++++++++++++++++++++++++++++++++++++++++++ Capter1/Game.h | 47 +++++++++ Capter1/ax_game.cpp | 41 ++++++++ Capter1/ax_game.hpp | 27 +++++ Capter1/ball.cpp | 11 ++ Capter1/ball.hpp | 9 ++ Capter1/main | Bin 0 -> 58224 bytes Capter1/main.cpp | 18 ++++ 8 files changed, 398 insertions(+) create mode 100644 Capter1/Game.cpp create mode 100644 Capter1/Game.h create mode 100644 Capter1/ax_game.cpp create mode 100644 Capter1/ax_game.hpp create mode 100644 Capter1/ball.cpp create mode 100644 Capter1/ball.hpp create mode 100755 Capter1/main create mode 100644 Capter1/main.cpp diff --git a/Capter1/Game.cpp b/Capter1/Game.cpp new file mode 100644 index 0000000..dbce8f4 --- /dev/null +++ b/Capter1/Game.cpp @@ -0,0 +1,245 @@ +#include "Game.h" + +const int thickness = 15; +const float paddleH = 100.0f; + +Game::Game():mWindow(nullptr),mRenderer(nullptr),mTicksCount(0),mIsRunning(true),mPaddleDir(0) +{ + +} + +bool Game::Initialize() +{ + // Initialize SDL + int sdlResult = SDL_Init(SDL_INIT_VIDEO); + if (sdlResult != 0) + { + SDL_Log("Unable to initialize SDL: %s", SDL_GetError()); + return false; + } + + // Create an SDL Window + mWindow = SDL_CreateWindow( + "Game Programming in C++ (Chapter 1)", // Window title + 100, // Top left x-coordinate of window + 100, // Top left y-coordinate of window + 1024, // Width of window + 768, // Height of window + 0 // Flags (0 for no flags set) + ); + + if (!mWindow) + { + SDL_Log("Failed to create window: %s", SDL_GetError()); + return false; + } + + //// Create SDL renderer + mRenderer = SDL_CreateRenderer( + mWindow, // Window to create renderer for + -1, // Usually -1 + SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC + ); + + if (!mRenderer) + { + SDL_Log("Failed to create renderer: %s", SDL_GetError()); + return false; + } + // + mPaddlePos.x = 10.0f; + mPaddlePos.y = 768.0f/2.0f; + mBallPos.x = 1024.0f/2.0f; + mBallPos.y = 768.0f/2.0f; + mBallVel.x = -200.0f; + mBallVel.y = 235.0f; + + return true; +} + +void Game::RunLoop() +{ + while (mIsRunning) + { + ProcessInput(); + UpdateGame(); + GenerateOutput(); + } +} + +void Game::ProcessInput() +{ + SDL_Event event; + while (SDL_PollEvent(&event)) + { + switch (event.type) + { + // If we get an SDL_QUIT event, end loop + case SDL_QUIT: + mIsRunning = false; + break; + } + } + + // Get state of keyboard + const Uint8* state = SDL_GetKeyboardState(NULL); + // If escape is pressed, also end loop + if (state[SDL_SCANCODE_ESCAPE]) + { + mIsRunning = false; + } + + // Update paddle direction based on W/S keys + mPaddleDir = 0; + if (state[SDL_SCANCODE_W]) + { + mPaddleDir -= 1; + } + if (state[SDL_SCANCODE_S]) + { + mPaddleDir += 1; + } +} + +void Game::UpdateGame() +{ + // Wait until 16ms has elapsed since last frame + while (!SDL_TICKS_PASSED(SDL_GetTicks(), mTicksCount + 16)) + ; + + // Delta time is the difference in ticks from last frame + // (converted to seconds) + float deltaTime = (SDL_GetTicks() - mTicksCount) / 1000.0f; + + // Clamp maximum delta time value + if (deltaTime > 0.05f) + { + deltaTime = 0.05f; + } + + // Update tick counts (for next frame) + mTicksCount = SDL_GetTicks(); + + // Update paddle position based on direction + if (mPaddleDir != 0) + { + mPaddlePos.y += mPaddleDir * 300.0f * deltaTime; + // Make sure paddle doesn't move off screen! + if (mPaddlePos.y < (paddleH/2.0f + thickness)) + { + mPaddlePos.y = paddleH/2.0f + thickness; + } + else if (mPaddlePos.y > (768.0f - paddleH/2.0f - thickness)) + { + mPaddlePos.y = 768.0f - paddleH/2.0f - thickness; + } + } + + // Update ball position based on ball velocity + mBallPos.x += mBallVel.x * deltaTime; + mBallPos.y += mBallVel.y * deltaTime; + + // Bounce if needed + // Did we intersect with the paddle? + float diff = mPaddlePos.y - mBallPos.y; + // Take absolute value of difference + diff = (diff > 0.0f) ? diff : -diff; + if ( + // Our y-difference is small enough + diff <= paddleH / 2.0f && + // We are in the correct x-position + mBallPos.x <= 25.0f && mBallPos.x >= 20.0f && + // The ball is moving to the left + mBallVel.x < 0.0f) + { + mBallVel.x *= -1.0f; + } + // Did the ball go off the screen? (if so, end game) + else if (mBallPos.x <= 0.0f) + { + mIsRunning = false; + } + // Did the ball collide with the right wall? + else if (mBallPos.x >= (1024.0f - thickness) && mBallVel.x > 0.0f) + { + mBallVel.x *= -1.0f; + } + + // Did the ball collide with the top wall? + if (mBallPos.y <= thickness && mBallVel.y < 0.0f) + { + mBallVel.y *= -1; + } + // Did the ball collide with the bottom wall? + else if (mBallPos.y >= (768 - thickness) && + mBallVel.y > 0.0f) + { + mBallVel.y *= -1; + } +} + +void Game::GenerateOutput() +{ + // Set draw color to blue + SDL_SetRenderDrawColor( + mRenderer, + 0, // R + 0, // G + 255, // B + 255 // A + ); + + // Clear back buffer + SDL_RenderClear(mRenderer); + + // Draw walls + SDL_SetRenderDrawColor(mRenderer, 255, 255, 255, 255); + + // Draw top wall + SDL_Rect wall{ + 0, // Top left x + 0, // Top left y + 1024, // Width + thickness // Height + }; + SDL_RenderFillRect(mRenderer, &wall); + + // Draw bottom wall + wall.y = 768 - thickness; + SDL_RenderFillRect(mRenderer, &wall); + + // Draw right wall + wall.x = 1024 - thickness; + wall.y = 0; + wall.w = thickness; + wall.h = 1024; + SDL_RenderFillRect(mRenderer, &wall); + + // Draw paddle + SDL_Rect paddle{ + static_cast(mPaddlePos.x), + static_cast(mPaddlePos.y - paddleH/2), + thickness, + static_cast(paddleH) + }; + SDL_RenderFillRect(mRenderer, &paddle); + + // Draw ball + SDL_Rect ball{ + static_cast(mBallPos.x - thickness/2), + static_cast(mBallPos.y - thickness/2), + thickness, + thickness + }; + SDL_RenderFillRect(mRenderer, &ball); + + // Swap front buffer and back buffer + SDL_RenderPresent(mRenderer); +} + +void Game::Shutdown() +{ + SDL_DestroyRenderer(mRenderer); + SDL_DestroyWindow(mWindow); + SDL_Quit(); +} \ No newline at end of file diff --git a/Capter1/Game.h b/Capter1/Game.h new file mode 100644 index 0000000..93705ef --- /dev/null +++ b/Capter1/Game.h @@ -0,0 +1,47 @@ +#pragma once +#include "SDL2/SDL.h" + +// Vector2 struct just stores x/y coordinates +// (for now) +struct Vector2 +{ + float x; + float y; +}; + +// Game class +class Game +{ +public: + Game(); + // Initialize the game + bool Initialize(); + // Runs the game loop until the game is over + void RunLoop(); + // Shutdown the game + void Shutdown(); +private: + // Helper functions for the game loop + void ProcessInput(); + void UpdateGame(); + void GenerateOutput(); + + // Window created by SDL + SDL_Window* mWindow; + // Renderer for 2D drawing + SDL_Renderer* mRenderer; + // Number of ticks since start of game + Uint32 mTicksCount; + // Game should continue to run + bool mIsRunning; + + // Pong specific + // Direction of paddle + int mPaddleDir; + // Position of paddle + Vector2 mPaddlePos; + // Position of ball + Vector2 mBallPos; + // Velocity of ball + Vector2 mBallVel; +}; \ No newline at end of file diff --git a/Capter1/ax_game.cpp b/Capter1/ax_game.cpp new file mode 100644 index 0000000..6400952 --- /dev/null +++ b/Capter1/ax_game.cpp @@ -0,0 +1,41 @@ +#include "ax_game.hpp" +#include "ball.hpp" + +ax_game::ax_game() +{ + ax_Window = nullptr; + ax_Renderer = nullptr; + ax_TickCounter = 0; + ax_IsRunning = true; + + ax_ball_one = ball(); +} + +ax_game::~ax_game() +{ + ax_ball_one.~ball(); +} + +bool ax_game::Init(){ + +} + +void ax_game::RunLoop(){ + +} + +void ax_game::Shutdown(){ + +} + +void ax_game::Input(){ + +} + +void ax_game::Update(){ + +} + +void ax_game::Output(){ + +} \ No newline at end of file diff --git a/Capter1/ax_game.hpp b/Capter1/ax_game.hpp new file mode 100644 index 0000000..286584f --- /dev/null +++ b/Capter1/ax_game.hpp @@ -0,0 +1,27 @@ +#pragma once +#include "SDL2/SDL.h" +#include "ball.hpp" + +class ax_game +{ +private: + void Input(); + void Update(); + void Output(); + + SDL_Window *ax_Window; + SDL_Renderer *ax_Renderer; + Uint32 ax_TickCounter; + bool ax_IsRunning; + + ball ax_ball_one; + + +public: + ax_game(); + ~ax_game(); + bool Init(); + void RunLoop(); + void Shutdown(); +}; + diff --git a/Capter1/ball.cpp b/Capter1/ball.cpp new file mode 100644 index 0000000..f432d22 --- /dev/null +++ b/Capter1/ball.cpp @@ -0,0 +1,11 @@ +#include "ball.hpp" + +ball::ball() +{ + x = 0; + y = 0; +} + +ball::~ball() +{ +} diff --git a/Capter1/ball.hpp b/Capter1/ball.hpp new file mode 100644 index 0000000..e70a5f8 --- /dev/null +++ b/Capter1/ball.hpp @@ -0,0 +1,9 @@ +class ball +{ +private: + float x; + float y; +public: + ball(); + ~ball(); +}; diff --git a/Capter1/main b/Capter1/main new file mode 100755 index 0000000000000000000000000000000000000000000000000000000000000000..276af1ef011a996f5f1049ed6b9cd8ec2a6d7b60595557ac99d01f6bd28410ed GIT binary patch literal 58224 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 literal 0 HcmV?d00001 diff --git a/Capter1/main.cpp b/Capter1/main.cpp new file mode 100644 index 0000000..19c6024 --- /dev/null +++ b/Capter1/main.cpp @@ -0,0 +1,18 @@ +//#include "Game.h" +#include "ax_game.hpp" + +int main(int argc, char** argv) +{ + /*Game game; + bool success = game.Initialize(); + if (success) + { + game.RunLoop(); + } + game.Shutdown(); + */ + + + + return 0; +} \ No newline at end of file