diff --git a/include/entities/entity-generic.h b/include/entities/entity-generic.h index 976de679803a0ccec77f696c9bd634a0bc18f042..aef3d46522b24e45c1c45ffe4bd9619b28aa41ff 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 0edc7c335f31cd625e54897eed7ed49a1e4c0c42..c554c52240fa7da8dcee6de851cadd0e8aca6a3b 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 a7ee083d48973a94aeabf3160add421a9f57a27f..c9347f5a965f4f6d2b3fb688d15c8dde11522000 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 321371fd05f3c825413d84fefd51359da4702c9e..9a56b644e2f6ed8101df4e4fcf7ac9434ef5b091 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 0caccd7a0c1327183e9810674db8ea9fc3dbd561..4fb1e62a9b43f5fa225d80086bf5a2289866cda8 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 a1382cd88c7f8d894040a2a79eabc5b654cc245a..3325eb5a3d91864c96f0555a525be3159f29b575 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