Salut,
Je bosse sur un moteur de jeu, et j'ai des soucis avec les variable globales dans une DLL.
J'ai structure mon jeux comme suit :
Une premiere DLL Engine qui contient le moteur du jeu, tout les mechanismes.
Une deuxieme DLL Objects, qui contient tout les objets specifiques au jeu, principalement des objets qui herite d'une classe GameObject et redefinissent juste des comportement.
Une troisieme DLL Editor, qui contient l'essentiel pour faire fonctionner l'editeur de jeu.
Engine sera utilise par le client du jeu.
Editor sera utilise par l'editeur de jeu.
Objects est utilise par les deux.
Afin de pouvoir instancier mes GameObject facilement, j'ai fais une classe GameObjectFactory.
1 2 3 4 5 6 7 8 9 10 11 12 13
| class EX_API 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;
}; |
La factory permet d'instancier mes GameObject a partir de leur nom de classe.
Donc si je register un BasicEnemy par exemple, j'y accederais avec la string "BasicEnemy"
Mon soucis vient pour la registration des objets.
J'ai definis une macro que j'appel dans le .cpp de chaque specialisation de GameObject :
#define REGISTER_GAMEOBJECT(className) static const GameObject * s_##className##decl = GameObjectFactory::Instance().Register(#className, new className());
Je me retrouve donc dans le .cpp avec :
1 2 3 4 5 6 7 8 9 10 11
| REGISTER_GAMEOBJECT(BasicEnemy)
// Ce qui revient a ecrire
// static const GameObject * s_BasicEnemydecl = GameObjectFactory::Instance().Register("BasicEnemy", new BasicEnemy());
BasicEnemy::BasicEnemy() :
m_life(1)
{
}
... |
Mon probleme est que, 1 fois sur 2, cette variable s_classNamedecl n'est pas initialisee. Tantot elle est bien appelee avant d'entrer dans le main, tantot elle ne l'est pas du tout.
Et je ne comprend absoluement pas pourquoi!
Quelqu'un pourrait-il m'expliquer les raisons du pourquoi et du comment?
J'utilise Visual Studio 2008 pour mon projet.
Partager