Bonjour,
Je dirais que je me débrouille pas mal en C ainsi qu'en programmation impérative en général, mais j'ai un problème avec la programmation orientée objet.
Jusqu'à présent je ne faisais que des petits programmes en C++, mais récemment j'ai voulu essayer quelque chose : créer un shoot'em'up en C++.
J'ai écumé un peu le net à la recherche de méthodes pour concevoir des classes en C++, mais je tombe la plupart du temps sur des articles pour débutant.
Je suis tombé également sur le "gang of four" mais je pense que cela ne correspond pas trop à mon problème.
Je tombe aussi sur de nombreux exemples de shared_ptr, d'auto_ptr mais leur exemples sont faits sur-mesure et sont beaucoup trop simples par rapport à ce qu'on peut rencontrer dans un vrai programme.
Le fait qu'il n'y ait pas "une seule meilleur solution" ou même "le choix entre plusieurs solutions avec chacune leur avantage" me déroute au point que j'ai déjà recommencé plusieurs fois mon code pourtant bien avancé.
Mon principal problème se situe pour l'instant au niveau de la conception de la classe "GameScreen" (écran de jeu) qui correspond à une situation de jeu.
Comme j'en ai un peu marre de me casser la tête là dessus et que je ne trouve rien sur le net, je voulais vous demander comment vous l'implémenteriez.
J'ai déjà les classes "Vessel" (vaisseau) qui dérive de "DisplayElement". Pourquoi cette dérivation ? Car je compte par exemple rajouter "Bomb" ou "Obstacle" qui dériveraient aussi de "DisplayElement".
La classe GameScreen représente l'écran qui défile et donc beaucoup de créations/destructions d'objets.
Il me faut aussi stocker quelque part la cible d'un éventuel missile guidé lancé par le joueur, de préférence dans la classe "GUI".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 class GameScreen { public: GameScreen(); ~GameScreen(); ... private: Container _renderingList; GUI _gui; };
Jusque là quelques unes de mes implémentations incluaient :
- Le passage uniquement par un identifiant, sauf que c'est très lourd à force
Ma classe "GUI" stockerait alors un ElementID
- L'utilisation de shared_ptr pour pouvoir accéder aux éléments de l'extérieur
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 GameScreen { public: typedef int ElementID; ElementID createVessel(); ElementID createObstacle(); ElementID getElementAtPosition(int x, int y); // 0 = aucun void setElementPosition(ElementID, int x, int y); etc. private: std::map<ElementID,DisplayElement*> _renderingList; Element _nextElementID; // incrémenté à chaque fois pour distribuer des IDs };
Mais si un vaisseau est détruit, le shared_ptr stocké dans GUI va empêcher sa destruction réelle (il ne va plus être affiché à l'écran mais il existera toujours, et la croix rouge que le GUI dessine dessus sera elle toujours affichée)
Il faudrait un moyen de signaler au GUI que la cible vient d'être détruite, sans pour autant casser l'indépendance que je pense nécessaire entre les différentes classes
Bien que ce problème puisse ici être résolu sans trop de problème (le GameScreen n'a qu'à vérifier si la cible du GUI correspond à un élément lorsqu'il est détruit), cela peut être je pense plus contraignant dans certains cas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 class GameScreen { public: std::shared_ptr<DisplayedElement> createVessel(); std::shared_ptr<DisplayedElement> createObstacle(); std::shared_ptr<DisplayedElement> getElementAtPosition(int, int); private: std::list<std::shared_ptr<DisplayedElement> > _renderingList; };
Au delà de l'implémentation de cette classe, je cherche plutôt des guides ou tutoriaux de règles à respecter en C++ pour une bonne gestion de ce genre de problèmes
En gros je voudrais connaître "les trucs que tout le monde connaît mais que c'est écrit nulle part", comme "les règles d'or à respecter" ou je ne sais quoi
Merci d'avance
Partager