Bonjour à tous,
Un ami et moi essayons de créer une bibliothèques permettant d'utiliser des règles de jeu de role de manière objet en C++.
Nous nous sommes penché sur un aspect un peu special et nous avons 2 idées pour concevoir cela, sachant que chacune a des avantages et inconvénient. On essaye de voir si une autre solution moins "facile à trouver" existe pour gérer cela.
Cela concerne ce qu'a le personnage, ce qu'il est : classe de personnage, caractéristique (force, constitution, intelligence, ...) . Ce qu'il peut faire : dons (des capacités choisies au fil des niveaux ou recu grace a la classe de personnage), des competences qui peuvent evoluer au fil des niveaux suivant le choix du joueur, les sorts, etc.
En gros, pour la 2 eme catégorie, ce qu'il peut faire, on a pensé que chaque sous catégorie permettait de faire des actions qui avaient des effets. Au final, ca devient assez générique, sauf que des compétences peuvent évoluer, alors que des dons, non; les sorts dépendent de sa classe etc.
On a rajouté dans les effets, que meme des caracteristiques pouvaient être le résultat d'un effet (une sorte de don invisible qui donne +4 en constitution par exemple). Or dans le cas des caractéristiques, de l'armure ou des points de vie, plusieurs type d'effets peuvent se cumuler : des bonus grace a des sorts, des bonus grace a une armure, des bonus grace a un don (ce bonus est donc l'"effet" du don).
Ainsi pour récupérer la valeur des points de vie, on ferait (attention, exemple bateau basique, mais bon, c pour expliquer)
Or dans une approche plutot héritage, on aurait des effets specialisés implémentant chaque fonction les intéressant : getPVBonus pour un PVBonusEffet, getCaracBonusEffet pour un CaracBonusEffet. Etc, etc
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 int getPV() { vector<Effet> listeEffetPV = getModificateursPV(); vector<Effet>::iterator ite; int totalPV = 0; for(ite.begin(); ite.end(); ++ite) { totalPV += fonctionRetournantLePVdeChaqueEffetPV; } return totalPV }
Or cela impliquerait que la classe abstraite Effet aurait toute les fonctions mais ne les implémenterait pas de base...
C'est pas terrible niveau souplesse si on doit rajouter des nouveaux types d'effets
L'autre approche serait de faire que chaque effet soit un Effet, mais que suivant le instanceEffet.type, le traitement diffère.
Ce qui revient a faire des if pas beau a chaque traitement. (et limite on pourrait passer par les RTTI et donc faire des classe spécialisé d'Effet + ou - vide permettant juste d'etre identifié par leur nom de classe...)
exemple :
De notre coté, on voudrait plutot une sorte de bibliotheques d'effets stockées en XML, donc avec un code générique s'adaptant aux données au niveau du runtime et non pas quelque chose ecrit dans le marbre avec une arborescence fixe d'heritage.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 class Effet { public: int getEffetValue() }; int getPV() { vector<Effet> listeEffetPV = getModificateursPV(); vector<Effet>::iterator ite; int totalPV = 0; for(ite.begin(); ite.end(); ++ite) { if(ite.type == "PV") { totalPV += ite.getEffetValue(); } } return totalPV
Je pense qu'il existe une solution plus propre, et plus orientée objet, seulement, elle ne nous est pas venu naturellement. Donc je ressors mon bouquin de design pattern/conception objet, mais je ne suis pas sur de faire un lien direct entre la solution montrée en exemple et mon cas pratique actuel...
Si on ne trouve pas d'ici 2 semaine, on risque de garder une des 2/3 solutions expliquée dessus ... Si je peux eviter si il existe une solution plus propre, ca m'interesserait ...
Merci de m'avoir lu !
Partager