VEX Engine
Retro looking game engine made in vulkan mostly because i wanted to understand it better.
Loading...
Searching...
No Matches
GameObjectFactory.hpp
Go to the documentation of this file.
1
6
7#pragma once
8#include "Engine.hpp"
9#include "components/ErrorUtils.hpp"
12
13#include "VEX/VEX_export.h"
14
15#include <functional>
16#include <unordered_map>
17#include <string>
18#include <vector>
19
20namespace vex {
21
23class VEX_EXPORT GameObjectFactory {
24public:
25 using ObjectConstructor = GameObject* (*)(Engine&, const std::string&);
26
27 using Creator = std::function<GameObject*(Engine&, const std::string&)>;
28
30 static GameObjectFactory& getInstance();
31
33 template<typename T>
34 static GameObject* constructObject(Engine& engine, const std::string& name) {
35 return new T(engine, name);
36 }
37
41 template<typename T>
42 void registerClass(const std::string& name, bool isDynamic = false) {
43 static_assert(std::is_base_of_v<GameObject, T>, "T must derive from GameObject");
44
45 registerCreator(name, &constructObject<T>, isDynamic);
46 }
47
54 GameObject* create(const std::string& type, Engine& engine, const std::string& name);
55
58 std::vector<std::string> GetAllRegisteredObjectTypes();
59
62 std::vector<std::string> GetNonDynamicRegisteredObjectTypes();
63
66 std::vector<std::string> GetDynamicRegisteredObjectTypes();
67
70 void clearDynamicGameObjects();
71
74 void UnregisterGameObjects();
75
76private:
77 GameObjectFactory() = default;
78
85 void registerCreator(const std::string& name, ObjectConstructor ctor, bool isDynamic);
86
87 std::unordered_map<std::string, Creator> creators;
88 std::vector<std::string> dynamicTypes;
89 std::vector<std::string> nonDynamicTypes;
90 std::vector<std::string> allTypes;
91};
92
103#ifdef GAME_MODULE_EXPORTS
104 #define REGISTER_GAME_OBJECT(ClassName) \
105 namespace { \
106 struct ClassName##Registrar { \
107 ClassName##Registrar() { \
108 GameObjectFactory::getInstance().registerClass<ClassName>(#ClassName, true); \
109 } \
110 }; \
111 static ClassName##Registrar ClassName##registrar; \
112 }
113#else
114 #define REGISTER_GAME_OBJECT(ClassName) \
115 namespace { \
116 struct ClassName##Registrar { \
117 ClassName##Registrar() { \
118 GameObjectFactory::getInstance().registerClass<ClassName>(#ClassName, false); \
119 } \
120 }; \
121 static ClassName##Registrar ClassName##registrar; \
122 }
123#endif
124
125}
Contains basic components like transform, camera, name components..
Contains main Engine class.
This file defines the GameObject class.
Class for interaction with engine systems.
Definition Engine.hpp:47
Class responsible for registering and then creating GameObjects eg. Player, CameraObject....
void registerCreator(const std::string &name, ObjectConstructor ctor, bool isDynamic)
Registers a creator function for a specific GameObject type string.
static GameObject * constructObject(Engine &engine, const std::string &name)
constructs registered objects, used internally in scene loading.
static GameObjectFactory & getInstance()
Get the singleton instance of the GameObjectFactory.
void registerClass(const std::string &name, bool isDynamic=false)
Register a GameObject class with the factory.
Its base class for all game objects, eg. Player, Enemy, Weapon. Your Class needs to inherit from it.