Ou déclarer une class qui va servir à plusieurs endroits ?

Ou déclarer une class qui va servir à plusieurs endroits ? - C++ - Programmation

Marsh Posté le 01-04-2012 à 12:35:08    

Salut à tous, et merci d'essayer de m'aider  :)
J'essaye de créer un petit rpg avec C++ et la bibliothèque sdl. J'ai un personnage qui se déplace sur une carte, des monstres, j'en suis à l'etape où il faut que le perso puisse taper les monstres.
Voilà pour la mise ne contexte, maintenant mon problème : mes fichiers s'organisent comme ceci :

Spoiler :


                   | personnage.h --> gererEvenements.h -->  |
Armes.h -->  |                                                             |
map.h     --> |                                                             | main.cpp
                   | pnj.h --------------------> organiserPnjs.h -->  |
(j'ai essayé de faire un schéma pour que ca soit plus clair, mais vu sa tronche je sais pas si c’était une bonne idée...)

 

Arme.h contient une classe armes qui me sert à ranger un tableau de structure "arme" contenant tout les caractéristiques de chaque armes (portée, dégâts...)
Mais je ne sais pas où définir l'objet mesArmes de type armes, sachant que je vais en avoir besoin dans "pnj" et surement dans "gererEvenements"...

 

Si je le définis directement dans armes.h (j'imagine que je vais me faire taper dessus pour avoir proposé ca) j'ai un "multiple define" à la compilation.
Si je le définis dans le main il va falloir que je le fasse remonter en paramètre je ne sais pas si c'est une bonne méthode
Peut-être qu'une classe pour organiser un tableau de trucs constants n’était pas la bonne solution ?

 

Merci d'avance pour vos reponses.

Message cité 1 fois
Message édité par beuted le 01-04-2012 à 13:17:15
Reply

Marsh Posté le 01-04-2012 à 12:35:08   

Reply

Marsh Posté le 01-04-2012 à 13:48:32    

beuted a écrit :

Si je le définis directement dans armes.h (j'imagine que je vais me faire taper dessus pour avoir proposé ca) j'ai un "multiple define" à la compilation.

Car tu n'emploies sans doute pas la technique standard  
#ifndef MYHEADER_H
#define MYHEADER_H
. . . // This will be seen by the compiler only once  
#endif /* MYHEADER_H */
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 01-04-2012 à 13:52:12    

Si si je fais ca systématiquement, en fait je viens de trouver comment faire en sorte de ne pas avoir ce bug sur un autre forum :  
http://www.developpez.net/forums/d [...] plusieurs/
 
Seulement reste ma question : Est-ce la bonne solution ?

Reply

Marsh Posté le 03-04-2012 à 09:41:25    

Recherche un peu un programme qui utilise le pattern Model View (http://qt-project.org/doc/qt-4.8/model-view-programming.html et eventuellement Controleur) pour voir a quoi ressemble ce genre de solution.. Tu peux aussi essayer d´utiliser une lib comme Qt et te servir du mechanisme signal / slot pour faire interagir tes instances.

Reply

Marsh Posté le 03-04-2012 à 13:18:50    

En gros, tu veux avoir un objet "mes armes" qui ne change pas dans tout le jeu, une seule instance ?


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 05-04-2012 à 15:52:23    

L'état de ton jeu doit être maintenu dans une classe, cette instance de classe est crée à l'initialisation du jeu ou de la partie, et au plus simple tu maintiens un pointeur vers cette instance, ou tu la passe aux trucs qui ont en besoin (mais ça peut être chiant).
 
// CGameStates.h
class CGameStates
{
public:
    CPlayerState PlayerState;
    std::vector<CWeapons> PlayerWeapons;
    CWorld World;
    std::vector<CMonsters> Monsters;
    // blah blah
};
 
// GameLoop.cpp
 
CGameStates *GameStates = NULL;
 
// in fine appelé par le main après l'initialisation du steak haché
void GameLoop()
{
    std::auto_ptr<CGameStates> LocalGameStates( new CGameStates );  
    GameStates  = LocalGameStates.get();
 
    while( // pas quit )
    {
        // gère les messages OS
        // qui utiliseront un "extern CGameStates *GameStates;"
        // gère les entrées
        // update le monde, players
        // dessigne le monde  
    }
}
 
Sinon tu passes le CGameStates en référence ou en pointeur à chaque sous-système de jeu qui en a besoin (ce qui permet de gérer plusieurs mondes simultanément)
Mais un moment donné, tu finis toujours par mettre des trucs en pointeur global.
Sinon tu fais un singleton pour faire plus C++ (static * avec le getter itou)


Message édité par bjone le 05-04-2012 à 15:56:07
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed