From 3d639b89d067a79db799c904888b91ae4136cd4b Mon Sep 17 00:00:00 2001 From: Benedikt Galbavy Date: Mon, 24 Jun 2024 16:03:46 +0200 Subject: [PATCH] #58 Replaced map based game factory with simpler implementation --- include/GameFactory.h | 21 +++++++++------------ include/GameRegistryHelper.h | 9 ++++++++- src/GameInternal.cpp | 2 +- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/include/GameFactory.h b/include/GameFactory.h index 443a2d6..1da56a7 100644 --- a/include/GameFactory.h +++ b/include/GameFactory.h @@ -31,23 +31,20 @@ public: return game; }*/ - void registerClass(const std::string& className, CreateFunc createFunc) { - this->creators[className] = createFunc; + void registerClass(CreateFunc createFunc) { + this->creatorFunc = createFunc; } - Game* create(const std::string& className, GameInternal* gameInternal) { - auto it = this->creators.find(className); - if (it != creators.end()) { - Game* game = it->second(); - game->gameInternal = gameInternal; - return game; - } - return nullptr; + Game* create(GameInternal* gameInternal) { + if (this->creatorFunc == nullptr) + return nullptr; + Game* game = (this->creatorFunc)(); + game->gameInternal = gameInternal; + return game; } private: - CreateFunc creator; - std::map creators; + CreateFunc creatorFunc = nullptr; }; /* diff --git a/include/GameRegistryHelper.h b/include/GameRegistryHelper.h index b980d70..7042047 100644 --- a/include/GameRegistryHelper.h +++ b/include/GameRegistryHelper.h @@ -6,10 +6,17 @@ namespace vego { template class GameRegistryHelper { public: + [[deprecated("GameRegistryHelper() does not take a className anymore")]] GameRegistryHelper(const std::string& className) { static_assert(std::is_base_of::value, "Your class must inherit from Game"); GameFactory::instance().registerClass( - className, + []() -> Game* { return new T; } + ); + }; + + GameRegistryHelper() { + static_assert(std::is_base_of::value, "Your class must inherit from Game"); + GameFactory::instance().registerClass( []() -> Game* { return new T; } ); }; diff --git a/src/GameInternal.cpp b/src/GameInternal.cpp index 5a490a8..53337e5 100644 --- a/src/GameInternal.cpp +++ b/src/GameInternal.cpp @@ -176,7 +176,7 @@ void GameInternal::init(const char* title, int xpos, int ypos, int width, int he // player2.addComponent(); // player2.addGroup((size_t) Entity::GroupLabel::PLAYERS); - this->gameInstance = GameFactory::instance().create("Chickengame", this); //!< \todo Should be specified via a config file + this->gameInstance = GameFactory::instance().create(this); this->gameInstance->init(); }