From 5b3ffd72753005eb65acafeb0005fac6a90bdd50 Mon Sep 17 00:00:00 2001 From: Alfred Burgess <aburgess@ucc.gu.uwa.edu.au> Date: Mon, 4 Dec 2023 11:09:56 +0800 Subject: [PATCH] Created entity manager --- include/entities/entity-generic.h | 21 ++++++++++++-- include/entity-manager.h | 24 ++++++++++++++-- include/main.h | 1 + src/entities/entity-generic.cpp | 6 ++-- src/entity-manager.cpp | 46 ++++++++++++++++++++++++++++--- src/main.cpp | 11 +++++++- 6 files changed, 97 insertions(+), 12 deletions(-) diff --git a/include/entities/entity-generic.h b/include/entities/entity-generic.h index 976de67..aef3d46 100644 --- a/include/entities/entity-generic.h +++ b/include/entities/entity-generic.h @@ -1,18 +1,33 @@ + #ifndef __ENTITIES__ENTITY_GENERIC_H #define __ENTITIES__ENTITY_GENERIC_H +// #include "entity-manager.h" #include "logger.h" class EntityGeneric { - + // friend class EntityManager; public: - EntityGeneric(); + EntityGeneric( const std::string& tag, size_t id ); /** @todo make this private */ ~EntityGeneric(); + + bool isAlive() { return this->_alive; } + bool isDead() { return ! this->_alive; } + void kill() { this->_alive = false; } + + // Component Variables + const std::string& tag() { return this->_tag; } + private: Logger& _logger; - const size_t m_id = 0; + const size_t _id = 0; + const std::string _tag = "Default"; + bool _alive = true; + }; +typedef EntityGeneric Entity; + #endif // __ENTITIES__ENTITY_GENERIC_H diff --git a/include/entity-manager.h b/include/entity-manager.h index 0edc7c3..c554c52 100644 --- a/include/entity-manager.h +++ b/include/entity-manager.h @@ -2,16 +2,36 @@ #define __ENTITY_MANAGER_H__ #include <string> +#include <vector> +#include <memory> +#include <map> + +#include "logger.h" +#include "entities/entity-generic.h" + +typedef EntityGeneric Entity; +typedef std::vector<std::shared_ptr<EntityGeneric>> EntityVector; +typedef std::map< std::string, EntityVector > EntityMap; class EntityManager { public: EntityManager(); ~EntityManager(); - void addEntity(); + std::shared_ptr<EntityGeneric> addEntity( const std::string& tag ); void removeEntity(); - void findEntity( std::string query ); + void update(); + + EntityVector& getEntities(); + EntityVector& getEntities( const std::string& tag ); private: + Logger& _logger; + EntityVector _entities; + EntityVector _entitiesToAdd; + EntityMap _entityMap; + size_t _totalEntities = 0; + + size_t nextId() { return this->_totalEntities++; } }; #endif // __ENTITY_MANAGER_H__ diff --git a/include/main.h b/include/main.h index a7ee083..c9347f5 100644 --- a/include/main.h +++ b/include/main.h @@ -18,5 +18,6 @@ enum GenerationMethod #include "logger.h" #include "entities/entity-generic.h" #include "maths/maths.h" +#include "entity-manager.h" #endif // MAIN_H diff --git a/src/entities/entity-generic.cpp b/src/entities/entity-generic.cpp index 321371f..9a56b64 100644 --- a/src/entities/entity-generic.cpp +++ b/src/entities/entity-generic.cpp @@ -1,6 +1,8 @@ #include "entities/entity-generic.h" -EntityGeneric::EntityGeneric() - : _logger( Logger::instance() ) +EntityGeneric::EntityGeneric( + const std::string& tag, size_t id +) : _tag( tag ), _id( id ), + _logger( Logger::instance() ) { this->_logger.info( "Generic Entity Created" ); } EntityGeneric::~EntityGeneric(){} diff --git a/src/entity-manager.cpp b/src/entity-manager.cpp index 0caccd7..4fb1e62 100644 --- a/src/entity-manager.cpp +++ b/src/entity-manager.cpp @@ -1,7 +1,45 @@ #include "entity-manager.h" -EntityManager::EntityManager(){} -EntityManager::~EntityManager(){} -void EntityManager::addEntity(){} +EntityManager::EntityManager() + : _logger( Logger::instance() ) +{ this->_logger.info( "Creating entity manager" ); } +EntityManager::~EntityManager() +{ + // while( auto entity = ) + // { delete entity; } + + this->_logger.info( "Deleting entity manager" ); +} +std::shared_ptr<Entity> EntityManager::addEntity( const std::string& tag ) +{ + auto entity = std::shared_ptr< Entity >( new EntityGeneric( tag, this->nextId() ) ); + this->_entitiesToAdd.push_back( entity ); + return entity; +} + +EntityVector& EntityManager::getEntities(){ return this->_entities; } +EntityVector& EntityManager::getEntities( const std::string& tag ){ + return this->_entities; +} + +void EntityManager::update() +{ + for( auto entity : this->_entities ) + { + if( entity->isDead() ) + { + /** @todo Implement this with a clean deletion taking into account iterator invalidation + */ + // Remove from this->entities; + // Remove from this->entitiesMap; + } + } + for( auto entity : this->_entitiesToAdd ) + { + this->_entities.push_back( entity ); + this->_entityMap[entity->tag()].push_back( entity ); + } + this->_entitiesToAdd.clear(); +} + void EntityManager::removeEntity(){} -void EntityManager::findEntity( std::string query ){} diff --git a/src/main.cpp b/src/main.cpp index a1382cd..3325eb5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,8 +8,12 @@ int main() { // Initialise Logger& logger = Logger::instance(); int tickCount = 0; + int _frame = 0; SaveManager saveManager; state = Initialise; + + EntityManager entityManager; + // Seed the random number generator srand(static_cast<unsigned int>(time(nullptr))); std::vector< EntityGeneric* > entities; @@ -40,10 +44,15 @@ int main() { state = Exit; } - + // Update Entities + entityManager.update(); // Process Input + // Movement Updates + // Collision Updates // Update Game State // Render Game + + _frame++; } // Clean-up -- GitLab