Hello.
Je continus de travailler sur un jeu perso, et pour bien faire, j'ai partage le jeu en deux DLL :
- une DLL Engine, qui contient le moteur de jeu, donc ce qui permet de gerer l'affichage, le son, les scene du jeu, le gameplay, etc.
- une DLL Data, qui contient les donnees propre au jeu, donc les game objects, les scenes, les menu, le tout code en C++.
Mon probleme est le suivant :
Dans la DLL Engine, j'ai declare une Factory, qui est un singleton avec une map<std::string, GameObject *>, qui stock des prototype des gameObject pour etre ensuite clones.
Elle dispose d'une fonction Register, pour inserer les prototypes, et une fonction Create pour les cloner.
Le EX_API contient le __cdecl
Dans ma deuxieme DLL, j'ai une classe BasicEnemy, qui me sert pour tester la factory. Elle ne fait rien de plus qu'un GameObject, sinon overload la fonction Clone().
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 class EX_API GameObjectFactory : public Singleton<GameObjectFactory> { friend class Singleton<GameObjectFactory>; public: GameObjectFactory(); ~GameObjectFactory(); GameObject * Register(const std::string & name, GameObject * obj); GameObject * Create(const std::string & name); private: boost::unordered_map<std::string, GameObject *> m_prototypes; };
Mon soucis est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 class EX_API BasicEnemy : public GameObject { public: BasicEnemy(); virtual ~BasicEnemy(); virtual GameObject * Clone() const; };
Pour que mes prototype s'enregistre automatiquement, j'ai fait une macro REGISTER_GAMEOBJECT, comme suis :
Et j'appel cette macro dans le fichier BasicEnemy.cpp, dans l'espace global
Code : Sélectionner tout - Visualiser dans une fenêtre à part #define REGISTER_GAMEOBJECT(className) static GameObject * s_##className##decl = GameObjectFactory::Instance().Register(#className, new className());
Enfin, je fais un projet Win32 window, dans lequel je ne fais... rien. Juste un int main().
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 #include <ExcellenceObjects/Enemies/BasicEnemy.hpp> #include <ExEngine/Gameplay/GameObjectFactory.hpp> namespace ex { REGISTER_GAMEOBJECT(BasicEnemy) BasicEnemy::BasicEnemy() { } ...
L'erreur est la suivante : A l'execution, j'obtiens un crash sur la fonction register de mon GameObjectFactory, donc lorsque j'appel la macro REGISTER_GAMEOBJECT depuis ma DLL Data.
Les Locals me disent que ma map n'a pas ete instanciee alors que la fonction a bien ete appelee.
Le "this" correspond a ma factory.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 + this 0x00000000 {size_=??? mlf_=??? cached_begin_bucket_=??? ...} const boost::unordered_detail::hash_table<boost::unordered_detail::map<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,boost::hash<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::equal_to<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,ex::GameObject *> > > > * const + k "BasicEnemy" const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & + bucket 0xcccccccc {next_=??? } boost::unordered_detail::hash_bucket<std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,ex::GameObject *> > > * + it 0xcccccccc {next_=??? } boost::unordered_detail::hash_bucket<std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,ex::GameObject *> > > *
Et c'est la que je ne comprend pas.
J'ai essaye de declarer mon Basic Object directement dans la DLL Engine, et ca marche.
Comment faire pour que ma Factory soit bien instanciee depuis ma DLL Data lorsque j'en ai besoin?
Partager