From b48d5d71839201df7a78d2a71c6f3fcce0a1870a Mon Sep 17 00:00:00 2001 From: Benedikt Galbavy Date: Tue, 15 Oct 2024 23:42:32 +0200 Subject: [PATCH 1/3] Added z-Index base render order --- include/Component.h | 1 - include/Entity.h | 1 - include/GameInternal.h | 3 ++- include/Manager.h | 1 - include/RenderManager.h | 19 +++++++++++++++++++ include/RenderObject.h | 26 ++++++++++++++++++++++++++ include/SpriteComponent.h | 9 +++++---- include/VEGO.h | 9 +++++++++ src/AssetManager.cpp | 4 ++-- src/Entity.cpp | 5 ----- src/GameInternal.cpp | 18 +++--------------- src/Manager.cpp | 5 ----- src/RenderManager.cpp | 24 ++++++++++++++++++++++++ src/RenderObject.cpp | 10 ++++++++++ src/SpriteComponent.cpp | 12 ++++++++---- src/TileComponent.cpp | 2 +- src/TransformComponent.cpp | 2 +- src/main.cpp | 17 +++++++++-------- 18 files changed, 119 insertions(+), 49 deletions(-) create mode 100644 include/RenderManager.h create mode 100644 include/RenderObject.h create mode 100644 include/VEGO.h create mode 100644 src/RenderManager.cpp create mode 100644 src/RenderObject.cpp diff --git a/include/Component.h b/include/Component.h index 095b370..566fee9 100644 --- a/include/Component.h +++ b/include/Component.h @@ -9,7 +9,6 @@ public: virtual void init() {} virtual void update() {} - virtual void draw() {} virtual ~Component() = default; }; \ No newline at end of file diff --git a/include/Entity.h b/include/Entity.h index 073b65d..196a105 100644 --- a/include/Entity.h +++ b/include/Entity.h @@ -42,7 +42,6 @@ public: manager(mManager) { }; void update() const; - void draw() const; bool isActive() const { return this->active; } void destroy() { diff --git a/include/GameInternal.h b/include/GameInternal.h index e300f2f..44cec2d 100644 --- a/include/GameInternal.h +++ b/include/GameInternal.h @@ -9,6 +9,7 @@ #include "Manager.h" #include "Vector2D.h" #include "Entity.h" +#include "RenderManager.h" typedef std::function gamefunction; @@ -42,8 +43,8 @@ public: /* static */ TextureManager* textureManager; /* static */ SoundManager* soundManager; - // moved globals Manager manager; + RenderManager renderManager; Map* map; // game specific, might not be needed for all types of games std::vector& tiles; diff --git a/include/Manager.h b/include/Manager.h index 3282d9d..bb2ad65 100644 --- a/include/Manager.h +++ b/include/Manager.h @@ -16,7 +16,6 @@ public: Manager(GameInternal* game) : game(game) {}; void update(); - void draw(); void refresh(); void addToGroup(Entity* mEntity, Group mGroup); diff --git a/include/RenderManager.h b/include/RenderManager.h new file mode 100644 index 0000000..9d60efc --- /dev/null +++ b/include/RenderManager.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +#include "RenderObject.h" + +class RenderManager { +public: + RenderManager() {}; + + void remove(RenderObject* obj); + void add(RenderObject* obj); + + void renderAll(); + +private: + std::vector renderObjects; + bool isSorted; +}; \ No newline at end of file diff --git a/include/RenderObject.h b/include/RenderObject.h new file mode 100644 index 0000000..5e7de99 --- /dev/null +++ b/include/RenderObject.h @@ -0,0 +1,26 @@ +#pragma once + +class RenderManager; + +class RenderObject +{ +public: + virtual void draw() {} + + RenderObject(int zIndex, RenderManager& renderManager); + ~RenderObject(); + + int getZIndex() { return this->zIndex; }; + + struct ZIndexComparator { + bool operator()(RenderObject const *lhs, RenderObject const *rhs ) const { + return lhs->zIndex < rhs->zIndex; + } + }; + +private: + int zIndex = 0; + +protected: + RenderManager& renderManager; +}; \ No newline at end of file diff --git a/include/SpriteComponent.h b/include/SpriteComponent.h index ed584a2..b1f3a32 100644 --- a/include/SpriteComponent.h +++ b/include/SpriteComponent.h @@ -8,10 +8,11 @@ #include "AnimationHandler.h" #include "Component.h" #include "Direction.h" +#include "RenderObject.h" class TransformComponent; -class SpriteComponent : public Component +class SpriteComponent : public Component, public RenderObject { public: int animationIndex = 0; @@ -31,13 +32,13 @@ private: bool flipped = false; public: - SpriteComponent() = default; - SpriteComponent(const char* path); + SpriteComponent(const char* path, int zIndex); SpriteComponent( const char* path, bool isAnimated, std::map>* animationList, - std::string defaultAnimation); + std::string defaultAnimation, + int zIndex); ~SpriteComponent(); void setTexture(const char* path); diff --git a/include/VEGO.h b/include/VEGO.h new file mode 100644 index 0000000..550fd61 --- /dev/null +++ b/include/VEGO.h @@ -0,0 +1,9 @@ +#include "GameInternal.h" + +namespace vego { + extern GameInternal* game; +} + +inline GameInternal& VEGO_Game() { + return *vego::game; +}; \ No newline at end of file diff --git a/src/AssetManager.cpp b/src/AssetManager.cpp index a772fe6..25ce8ad 100644 --- a/src/AssetManager.cpp +++ b/src/AssetManager.cpp @@ -50,7 +50,7 @@ void AssetManager::createProjectile(Vector2D pos, Vector2D velocity, int scale, auto& projectile(man->addEntity()); projectile.addComponent(pos.x, pos.y, 32, 32, scale); //32x32 is standard size for objects - projectile.addComponent(texturePath); + projectile.addComponent(texturePath, 4); projectile.addComponent(range, speed, velocity, owner); projectile.addComponent("projectile", 0.6f); projectile.addGroup((size_t)Entity::GroupLabel::PROJECTILE); @@ -62,7 +62,7 @@ void AssetManager::createPowerup(Vector2D pos, std::function pic powerups.addComponent(pos.x, pos.y, 32, 32, 1); //32x32 is standard size for objects try { - powerups.addComponent(texturePath.c_str()); + powerups.addComponent(texturePath.c_str(), 3); } catch (std::runtime_error e) { std::cout << e.what() << std::endl; diff --git a/src/Entity.cpp b/src/Entity.cpp index 4710983..60455c1 100644 --- a/src/Entity.cpp +++ b/src/Entity.cpp @@ -9,11 +9,6 @@ void Entity::update() const for (auto const& c : components) c->update(); } -void Entity::draw() const -{ - for (auto const& c : components) c->draw(); -} - bool Entity::hasGroup(Group mGroup) { return groupBitSet[mGroup]; diff --git a/src/GameInternal.cpp b/src/GameInternal.cpp index 0e7587b..c5ba507 100644 --- a/src/GameInternal.cpp +++ b/src/GameInternal.cpp @@ -4,6 +4,7 @@ #include "CollisionHandler.h" #include "AssetManager.h" +#include "RenderManager.h" #include "SoundManager.h" #include "TileComponent.h" #include "Direction.h" @@ -18,6 +19,7 @@ GameInternal::GameInternal() : manager(this), + renderManager(), tiles(manager.getGroup((size_t)Entity::GroupLabel::MAPTILES)), players(manager.getGroup((size_t)Entity::GroupLabel::PLAYERS)), projectiles(manager.getGroup((size_t)Entity::GroupLabel::PROJECTILE)), @@ -169,21 +171,7 @@ void GameInternal::update() void GameInternal::render() { SDL_RenderClear(renderer); - for (auto& t : tiles) - t->draw(); - - for (auto& p : powerups) - p->draw(); - - for (auto& p : players) - p->draw(); - - for (auto& p : projectiles) - p->draw(); - - for (auto& h : hearts) - h->draw(); - + this->renderManager.renderAll(); SDL_RenderPresent(renderer); } diff --git a/src/Manager.cpp b/src/Manager.cpp index 50cb5ea..09eea97 100644 --- a/src/Manager.cpp +++ b/src/Manager.cpp @@ -6,11 +6,6 @@ #include "Constants.h" #include "Entity.h" -void Manager::draw() -{ - for (auto& e : entities) e->draw(); -} - void Manager::refresh() { for (auto i(0u); i < MAX_GROUPS; i++) diff --git a/src/RenderManager.cpp b/src/RenderManager.cpp new file mode 100644 index 0000000..634d389 --- /dev/null +++ b/src/RenderManager.cpp @@ -0,0 +1,24 @@ +#include "RenderManager.h" +#include "RenderObject.h" +#include + +void RenderManager::renderAll() +{ + if (!this->isSorted) { + std::ranges::sort(this->renderObjects, RenderObject::ZIndexComparator()); + } + std::ranges::for_each(this->renderObjects, [](RenderObject* obj) { + obj->draw(); + }); +} + +void RenderManager::add(RenderObject* renderObject) { + this->renderObjects.emplace_back(renderObject); + this->isSorted = false; +} + +void RenderManager::remove(RenderObject* renderObject) +{ + this->renderObjects.erase(std::remove(this->renderObjects.begin(), this->renderObjects.end(), renderObject), this->renderObjects.end()); + this->isSorted = false; +} \ No newline at end of file diff --git a/src/RenderObject.cpp b/src/RenderObject.cpp new file mode 100644 index 0000000..5c21ee9 --- /dev/null +++ b/src/RenderObject.cpp @@ -0,0 +1,10 @@ +#include "RenderObject.h" +#include "RenderManager.h" + +RenderObject::RenderObject(int zIndex, RenderManager& renderManager) : zIndex(zIndex), renderManager(renderManager) { + renderManager.add(this); +} + +RenderObject::~RenderObject() { + this->renderManager.remove(this); +} \ No newline at end of file diff --git a/src/SpriteComponent.cpp b/src/SpriteComponent.cpp index 2c730cf..6c1963d 100644 --- a/src/SpriteComponent.cpp +++ b/src/SpriteComponent.cpp @@ -6,13 +6,16 @@ #include "AnimationHandler.h" #include "Direction.h" +#include "ProjectileComponent.h" +#include "RenderObject.h" #include "TextureManager.h" #include "Entity.h" #include "TransformComponent.h" #include "GameInternal.h" #include "Manager.h" +#include "VEGO.h" -SpriteComponent::SpriteComponent(const char* path) +SpriteComponent::SpriteComponent(const char* path, int zIndex) : RenderObject(zIndex, VEGO_Game().renderManager) { this->texturePath = path; } @@ -21,7 +24,8 @@ SpriteComponent::SpriteComponent( const char* path, bool isAnimated, std::map>* animationMap, - std::string defaultAnimation) + std::string defaultAnimation, + int zIndex) : RenderObject(zIndex, VEGO_Game().renderManager) { animated = isAnimated; @@ -36,7 +40,7 @@ SpriteComponent::~SpriteComponent() {} void SpriteComponent::setTexture(const char* path) { - this->texture = this->entity->getManager().getGame()->textureManager->loadTexture(path); + this->texture = VEGO_Game().textureManager->loadTexture(path); } void SpriteComponent::init() @@ -68,7 +72,7 @@ void SpriteComponent::update() void SpriteComponent::draw() { - this->entity->getManager().getGame()->textureManager->draw(this->entity->getManager().getGame()->renderer, this->texture, this->srcRect, this->destRect, this->animated && this->flipped); + this->entity->getManager().getGame()->textureManager->draw(VEGO_Game().renderer, this->texture, this->srcRect, this->destRect, this->animated && this->flipped); } void SpriteComponent::playAnimation(std::string type) diff --git a/src/TileComponent.cpp b/src/TileComponent.cpp index eeebb92..4c33bf7 100644 --- a/src/TileComponent.cpp +++ b/src/TileComponent.cpp @@ -31,7 +31,7 @@ void TileComponent::init() this->entity->addComponent(this->tileRect.x, this->tileRect.y, this->tileRect.w, this->tileRect.h, 1); this->transform = &entity->getComponent(); - this->entity->addComponent(this->path); + this->entity->addComponent(this->path, 0); this->sprite = &entity->getComponent(); } diff --git a/src/TransformComponent.cpp b/src/TransformComponent.cpp index 4baf67e..3854176 100644 --- a/src/TransformComponent.cpp +++ b/src/TransformComponent.cpp @@ -72,7 +72,7 @@ void TransformComponent::modifySpeed(int8_t modifier) void TransformComponent::setPositionAfterCollision(Vector2D& positionChange) { - std::initializer_list colliders = { Entity::GroupLabel::MAPTILES, Entity::GroupLabel::COLLIDERS }; + std::initializer_list colliders = { Entity::GroupLabel::MAPTILES, Entity::GroupLabel::COLLIDERS }; IntersectionBitSet intersections = (CollisionHandler::getIntersectionWithBounds(entity, Vector2D(positionChange.x, 0)) | (this->entity->getManager() diff --git a/src/main.cpp b/src/main.cpp index cc8be77..da7f8a6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,11 +1,12 @@ #include #include +#include "VEGO.h" #include "Entity.h" #include "GameInternal.h" #include "Constants.h" -GameInternal* game = nullptr; +GameInternal* vego::game = nullptr; int main(int argc, char* argv[]) { @@ -17,15 +18,15 @@ int main(int argc, char* argv[]) Uint32 frameStart; int frameTime; - game = new GameInternal(); + vego::game = new GameInternal(); - game->init("No_Name_Chicken_Game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_SIZE_WIDTH, SCREEN_SIZE_HEIGHT, false); - while (game->isRunning()) { + vego::game->init("No_Name_Chicken_Game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_SIZE_WIDTH, SCREEN_SIZE_HEIGHT, false); + while (vego::game->isRunning()) { frameStart = SDL_GetTicks(); - game->handleEvents(); - game->update(); - game->render(); + vego::game->handleEvents(); + vego::game->update(); + vego::game->render(); frameTime = SDL_GetTicks() - frameStart; @@ -34,7 +35,7 @@ int main(int argc, char* argv[]) } } - game->clean(); + vego::game->clean(); return 0; } \ No newline at end of file From 686ebbb97fe7bc380ba0225a4e2a5806f37a64be Mon Sep 17 00:00:00 2001 From: Benedikt Galbavy Date: Wed, 16 Oct 2024 13:38:20 +0200 Subject: [PATCH 2/3] Added documentation --- include/RenderManager.h | 12 +++++++++++- include/RenderObject.h | 3 ++- src/RenderManager.cpp | 1 + 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/include/RenderManager.h b/include/RenderManager.h index 9d60efc..86aa614 100644 --- a/include/RenderManager.h +++ b/include/RenderManager.h @@ -8,10 +8,20 @@ class RenderManager { public: RenderManager() {}; + /* + * Remove an object from the list of objects to be rendered + * \param renderObject The object to be removed + * \sa RenderObject + */ void remove(RenderObject* obj); + /* + * Add an object to be rendered + * \param renderObject The object to be rendered + * \sa RenderObject + */ void add(RenderObject* obj); - void renderAll(); + void renderAll(); //!< Render all objects. If the list has been modified, sorts it based on z-index first private: std::vector renderObjects; diff --git a/include/RenderObject.h b/include/RenderObject.h index 5e7de99..ba4b929 100644 --- a/include/RenderObject.h +++ b/include/RenderObject.h @@ -5,13 +5,14 @@ class RenderManager; class RenderObject { public: - virtual void draw() {} + virtual void draw() = 0; RenderObject(int zIndex, RenderManager& renderManager); ~RenderObject(); int getZIndex() { return this->zIndex; }; + //! Comparitor to compare two ptr based on z-index struct ZIndexComparator { bool operator()(RenderObject const *lhs, RenderObject const *rhs ) const { return lhs->zIndex < rhs->zIndex; diff --git a/src/RenderManager.cpp b/src/RenderManager.cpp index 634d389..dfa77f9 100644 --- a/src/RenderManager.cpp +++ b/src/RenderManager.cpp @@ -2,6 +2,7 @@ #include "RenderObject.h" #include + void RenderManager::renderAll() { if (!this->isSorted) { From 074d285affe1d7adda1d63f28375b8d88eebaac0 Mon Sep 17 00:00:00 2001 From: Benedikt Galbavy Date: Wed, 16 Oct 2024 13:57:23 +0200 Subject: [PATCH 3/3] Adjusted for loop --- src/RenderManager.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/RenderManager.cpp b/src/RenderManager.cpp index dfa77f9..e2e82af 100644 --- a/src/RenderManager.cpp +++ b/src/RenderManager.cpp @@ -2,15 +2,14 @@ #include "RenderObject.h" #include - void RenderManager::renderAll() { if (!this->isSorted) { std::ranges::sort(this->renderObjects, RenderObject::ZIndexComparator()); } - std::ranges::for_each(this->renderObjects, [](RenderObject* obj) { + for (RenderObject* obj : this->renderObjects) { obj->draw(); - }); + } } void RenderManager::add(RenderObject* renderObject) {