From 2983b919cd03255aad4f5664b86a2125d3f3f2d1 Mon Sep 17 00:00:00 2001 From: DcruBro Date: Sat, 14 Mar 2026 22:27:54 +0100 Subject: [PATCH] basic movement --- include/game/agame/background.hpp | 20 +++++++ include/game/agame/camcontroller.hpp | 26 +++++++++ include/game/agame/player.hpp | 1 + include/game/gamemanager.hpp | 3 +- include/object/camera.hpp | 24 +++++++++ include/object/entity.hpp | 11 +++- include/object/transform.hpp | 2 + include/renderer/renderer.hpp | 7 +++ include/renderer/texture.hpp | 4 ++ include/state/gamestate.hpp | 5 ++ include/utils.hpp | 5 +- include/window/window.hpp | 9 ++-- resources/bgtest.png | Bin 0 -> 2059714 bytes src/game/agame/background.cpp | 31 +++++++++++ src/game/agame/camcontroller.cpp | 41 ++++++++++++++ src/game/agame/player.cpp | 29 ++++++---- src/game/gamemanager.cpp | 8 +-- src/main.cpp | 5 ++ src/object/camera.cpp | 26 +++++++++ src/object/entity.cpp | 77 +++++++++++++++++++-------- src/object/sound.cpp | 2 + src/renderer/renderer.cpp | 18 +++++-- src/state/gamestate.cpp | 46 ++++++++++++++-- src/window/window.cpp | 25 ++++++--- 24 files changed, 368 insertions(+), 57 deletions(-) create mode 100644 include/game/agame/background.hpp create mode 100644 include/game/agame/camcontroller.hpp create mode 100644 include/object/camera.hpp create mode 100644 resources/bgtest.png create mode 100644 src/game/agame/background.cpp create mode 100644 src/game/agame/camcontroller.cpp create mode 100644 src/object/camera.cpp diff --git a/include/game/agame/background.hpp b/include/game/agame/background.hpp new file mode 100644 index 0000000..f5af0cc --- /dev/null +++ b/include/game/agame/background.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include +#include +#include +#include + +namespace Game::AGame { + class Background : public Object::Entity { + using Object::Entity::Entity; + + public: + ~Background() override = default; + void start() override; + void update(float deltaTime) override; + + private: + Object::Sound mSound; + }; +} \ No newline at end of file diff --git a/include/game/agame/camcontroller.hpp b/include/game/agame/camcontroller.hpp new file mode 100644 index 0000000..6e39913 --- /dev/null +++ b/include/game/agame/camcontroller.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include +#include +#include +#include + +namespace Game::AGame { + class CamController : public Object::Entity { + using Object::Entity::Entity; + + public: + ~CamController() override = default; + void start() override; + void update(float deltaTime) override; + void onWindowResized(int newWidth, int newHeight) override { + mScreenW = newWidth; + mScreenH = newHeight; + } + + private: + float mSpeed = 200.f; // Pixels per second + int mScreenW, mScreenH; + int mEdgeTolerance = 200; + }; +} \ No newline at end of file diff --git a/include/game/agame/player.hpp b/include/game/agame/player.hpp index 0ee854f..6e8a398 100644 --- a/include/game/agame/player.hpp +++ b/include/game/agame/player.hpp @@ -16,5 +16,6 @@ namespace Game::AGame { private: Object::Sound mSound; + float mSpeed = 200.f; // Pixels per second }; } \ No newline at end of file diff --git a/include/game/gamemanager.hpp b/include/game/gamemanager.hpp index cdb0db5..a6327cb 100644 --- a/include/game/gamemanager.hpp +++ b/include/game/gamemanager.hpp @@ -7,6 +7,7 @@ #include #include #include +#include namespace Game { using clock = std::chrono::steady_clock; @@ -22,7 +23,7 @@ namespace Game { void setTargetUpdatesPerSecond(int target) { mTargetUpdatesPerSecond = target; } int getTargetUpdatesPerSecond() { return mTargetUpdatesPerSecond; } private: - int mTargetUpdatesPerSecond = 60; + int mTargetUpdatesPerSecond = TARGET_UPDATE_RATE; clock::time_point mLastUpdate; }; } \ No newline at end of file diff --git a/include/object/camera.hpp b/include/object/camera.hpp new file mode 100644 index 0000000..8d478fd --- /dev/null +++ b/include/object/camera.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include +#include + +namespace Game::Object { + class Camera { + public: + Camera() = default; + DISABLE_COPY_AND_MOVE(Camera) + ~Camera() = default; + + static Camera& getInstance(); + + void setPosition(float x, float y); + void getPosition(float& x, float& y) const; + void move(float deltaX, float deltaY); + + private: + mutable std::mutex mMutex; + float mX = 0.0f; + float mY = 0.0f; + }; +} \ No newline at end of file diff --git a/include/object/entity.hpp b/include/object/entity.hpp index 1ab34a4..34fb865 100644 --- a/include/object/entity.hpp +++ b/include/object/entity.hpp @@ -7,6 +7,7 @@ #include #include #include +#include namespace Game::Renderer { class Renderer; @@ -24,9 +25,12 @@ namespace Game::Object { Entity& operator=(Entity&&) noexcept; virtual ~Entity() = 0; + // Start is called when the entity is spawned virtual void start() = 0; + // Update is called every update cycle; deltaTime is the time (in seconds) since the last update call virtual void update(float deltaTime) = 0; - void render(Game::Renderer::Renderer* renderer); + virtual void onWindowResized(int newWidth, int newHeight) {} // Called when the window is resized, with the new width and height in pixels + void render(Game::Renderer::Renderer* renderer, Game::Renderer::RendererConfig config); // Setters and getters void setTexture(std::shared_ptr tex) { mTex = tex; } @@ -37,12 +41,15 @@ namespace Game::Object { std::string getName() { return mName; } Transform* getTransform() { return &mTransform; } bool isActive() { return mIsActive; } + int getZIndex() const { return mZIndex; } + protected: std::string mName; std::shared_ptr mTex; Transform mTransform; bool mIsActive; + int mZIndex = 0; // For rendering order; higher zIndex renders on top of lower zIndex + float mTiledScale = 1.f; // Only used if the texture is tiled, to determine how much to scale the texture when rendering (since the entire texture is rendered as a single tile, this is necessary to be able to have different sized tiles) private: - float mScaleConstant = 0.25f; }; } \ No newline at end of file diff --git a/include/object/transform.hpp b/include/object/transform.hpp index 96ea910..bc288c7 100644 --- a/include/object/transform.hpp +++ b/include/object/transform.hpp @@ -5,6 +5,8 @@ namespace Game::Object { float x, y; float rotation; // In degrees, clockwise float scaleX, scaleY; + float adjustedScaleX() const { return scaleX * UNIVERSAL_SCALE_COEFFICIENT; } + float adjustedScaleY() const { return scaleY * UNIVERSAL_SCALE_COEFFICIENT; } } Transform; constexpr Transform DEFAULT_TRANSFORM{0.f, 0.f, 0.f, 1.f, 1.f}; diff --git a/include/renderer/renderer.hpp b/include/renderer/renderer.hpp index c26daed..edf55e2 100644 --- a/include/renderer/renderer.hpp +++ b/include/renderer/renderer.hpp @@ -6,6 +6,13 @@ #include namespace Game::Renderer { + typedef struct { + float camX; + float camY; + int screenW; + int screenH; + } RendererConfig; + class Renderer { public: Renderer(); diff --git a/include/renderer/texture.hpp b/include/renderer/texture.hpp index 7f6b677..8ae6995 100644 --- a/include/renderer/texture.hpp +++ b/include/renderer/texture.hpp @@ -19,9 +19,13 @@ namespace Game::Renderer { std::string getId(); float getWidth(); float getHeight(); + bool isTiled() { return mIsTiled; } + void setTiled(bool tiled) { mIsTiled = tiled; } protected: SDL_Texture* mTex; std::string mId; + private: + bool mIsTiled = false; // Whether the texture is a tileset that should be rendered as a single tile or not }; } \ No newline at end of file diff --git a/include/state/gamestate.hpp b/include/state/gamestate.hpp index af491dd..0ee2e20 100644 --- a/include/state/gamestate.hpp +++ b/include/state/gamestate.hpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -18,6 +19,10 @@ namespace Game::State { fn(mEntities); } + void sort(); // Sort entities by zIndex for correct rendering order + Object::Entity* getEntityByName(const std::string& name); // Get an entity by name, returns nullptr if no entity with the name exists + std::vector getEntitiesSnapshot(bool sortByZIndex = false); // Get a stable snapshot of entity pointers for iteration outside the lock + // Update entity at index, by REFERENCE. Object::Entity* getAtIndex(size_t at); // Add an entity to the gamestate. diff --git a/include/utils.hpp b/include/utils.hpp index 685d1c6..f51de91 100644 --- a/include/utils.hpp +++ b/include/utils.hpp @@ -34,4 +34,7 @@ #define RUNNING_TIME() \ SDL_GetTicks() / 1000.f -#define PI 3.14159265358979323846f \ No newline at end of file +#define PI 3.14159265358979323846f +#define UNIVERSAL_SCALE_COEFFICIENT 0.25f +#define TARGET_FPS 60 +#define TARGET_UPDATE_RATE 60 \ No newline at end of file diff --git a/include/window/window.hpp b/include/window/window.hpp index 832303f..938c1a5 100644 --- a/include/window/window.hpp +++ b/include/window/window.hpp @@ -11,6 +11,7 @@ #include #include