Alors voilà je poste ici parceque en ce moment je programme un petit jeux de rôle inspiré de plusieurs autres, enfin pas un gros projet.
J'ai défini les classes de base tel que player, player_stats, etc.... et j'en arrive à un petit problème :
J'ai donc une classe item qui sert de classe de base à mes différents types d'objets : item_usable pour les potions ou objets rendant des vies, etc..., item_equipement pour les armures, armes et compagnie, et item_fragment, c'est un peu spécifique, c'est des objets que l'on insère dans les armes et armures afin de leur donner des propriétés spéciales.
Bref, je commence la programmation de ma classe tout joyeux, et je met une méthode use virtuelle tel que :
class item
{
protected:
string nom,description; //nom et description de l'objet
item(const string &, const string &);
public:
string getName() const; //renvoie le nom de l'objet
string getDescription() const; //renvoie la description de l'objet
virtual void use(warrior*) =0; //méthode appelée si l'objet est utilisé
virtual ~item();
};
Donc ça paraît assez clair, je crois.
Déjà dès le début, après avoir programmé les autres classes (je sais, parfois faut un peu réfléchir avant d'agir), je me dis que ce n'est pas très logique de faire une métode use, car si on réfléchit, l'action est faite par le joueur qui boit la potion ou équipe son armure, et non pas par l'objet lui-même. De surcroît, les objets sont bien trop différents : tandis que les potions pourraient se satisfaire de la seule méthode use, les équipements doivent avoir aussi une méthode inverse pour être déséquipés et les fragments n'ont aucune méthode use (ils sont simplement utilisés dans la méthode putFragment de item_equipement).
Il apparaît alors que ces types sont trop différents et ne doivent pas vraiment avoir une classe de base commune. Néanmoins, ce sont quand même tous des objets, et de plus le polymorphisme est nécessaire par exemple pour ma classe bag (désignant le sac à dos du joueur contenant les objets) qui doit manipuler des objets sans se soucier de leur type ou encore la méthode itemDropped de joueur qui prends en paramètre un item en général, cette méthode "event " étant appelée lorsque le joueur ramasse un objet.
Voila donc, je voulais vous demander votre avis et surtout vos idées quant à comment organiser tout ça. Désolé pour la longueur, j'ai des petits problèmes à être synthétique ^^ et comme on dit à la SNCF, merci de votre attention
++
__________________________
Lorsque touts les arbres auront été coupés, Lorsque touts les animaux auront été chassés, Lorsque touts les poissons auront été pêchés;
Alors l'homme découvrira que l'argent ne se mange pas.
------ |_o/e _|a/a---------
Perso, je vois ca comme ca :
Certes, il s'agit de ton joueur qui utilise ton objet... mais cette méthode ne doit etre que très généralisée de manière à en appeller une, correspondante à l'objet en question (et se trouvant donc dans la classe de ton objet) et qui va agir sur le perso selon ses caractéristiques...
Ta classe de base item contiendrait donc bien une méthode use qui prendrait un certain nombre de paramètres (pas obligé mais bon... si on tient compte de l'environnement du perso, ca peut etre sympa ) et renvoyant en tout cas un résultat qui va modifier les stats de ton joueur...
Bien sur, ta méthode use (d'un objet particulier) pourra appeller d'autres méthodes (privées) pour prendre en compte un certain nombre de paramètres (du joueur, de l'objet, de l'environnement directe du perso)...
L'environnement du perso signifie donc qu'un objet, comme une armure par exemple, est constamment utilisé (il faut donc appeller use en permanence ou dès qu'un changement d'environnment du perso est constaté). Par exemple, ton armure (on va dire une armure bien pourri pour commencer ) est faite de métal et ton perso est en train de traverser un lac de magma... ben, l'armure va légèrement modifier son comportement en fonction de cet environnement très hostile, ce qui va avoir des conséquences sur le perso (s'épuisera plus vite au combat = armure moins résistante = ...)...
Voila...
J'espère que j'ai rien oublié...
__________________________
Sujet résolu ? Pensez à mettre le tag
Un problème en C# ? Vérifiez celui-ci n'est pas déjà résolu dans la FAQ et que le sujet n'est pas traité parmis les tutoriaux ou les articles avant de poster dans le forum C#.
Personnelement je verrais pas de méthodes virtuelle use dans item, justement parce que toutes les classes dérivées ne devraient pas à l'implémenter.
Cependant, la classe item n'est pas une si mauvaise idée (je suppose que c'est une classe abstraite) à mon goût.
Ce qui serais ptet pas mal c'est de faire deux sous classes (ou interface): objets consommable et non consommable, la première implémenterais donc une méthode effet.
Ensuite, la méthode use (qui serais donc dans la classe joueur) recevrais en paramètre un objet consommable, et dans cette méthode tu appelerais la méthode effet de l'objet consommé.
Donc, en résumé, je verais ça (en C#, la flemme de le faire en C++) :
class Personnage
{
public bool use (Item_consom i)
{ i.effet(this); /*reste de la méthode*/}
[...]
}
abstract class Item_consom
{public virtual void effet(Personnage p);}
//une classe décrivant une potion de force
class Potion_Force : Item_consom
{
public override void effet(Personnage p)
{
p.set_For(p.get_For()+puissance);
}
protected int puissance;
}
Valà, dit moi ce que tu penses de ça
Au fait, tu reviens modérer le forum Java ?
€dit : grillé par Czayfaboo
__________________________
[col]Woufeil[/col] et respectez la charte.
D'abord, merci pour vos réponses (et vos questions pour woufeil )
En fait, tout dépends de quel manière il faudrait implémenter la chose. Czayfaboo en fait, ton idée est très bonne mais n'est pas très adaptée car mon jeux n'est pas aussi poussé, et par soucis de simplicité on considérera qu'un équipement ne modifie le comportement d'un joueur que lorsqu'il est mis ou retiré.
Woufeil en fait, j'hésite car ta méthode implique de créer une classe dérivée pour chaque potion ou objet consommable différent, je pensais plutôt dans mon esprit à une classe consommable plutôt générique contenant des variables prenant en compte toutes les modifications possibles applicables à un joueur (pourrais encapsuler tout ça dans une classe Effets par exemple) et ainsi, j'ai une seule classe pour tous les types de potions. Je suis parti de la même idée pour les équipements. Après, peut être que c'est un peu trop rigide, je pourrais par exemple faire 5 classe de potions, classe potion_regen pour celles qui rendent des vies/de la magie, potion_temp pour celles qui modifient des stats temporairement, etc... En fait, tout dépends de la taille de ma base de données.
Après l'autre problème, ça va être d'identifier dynamiquement les types, car dès lors que je garde une référence des objets dans un sac ne contenant que des item (ils auront perdu leur typage), lorsque je dois les passer en paramètre à perso.consomme() par exemple, je dois vérifier que le joueur n'essaye pas de lui faire avaler une armure. Typeid étoussa étant très lourd (et moche) et instanceof du Java (et peut être aussi en C#, je connais pas) n'étant pas présent en C++, la classe abstraite de base pose des problèmes quand il faut faire la conversion inverse en fait.
Au niveau de la logique, je pense que l'idée dépends encore de l'organisation décrite ci-dessus : si je dérive une classe pour chaque type d'objet différent, alors une méthode effet() dans la classe item_consom ou autre est envisageable. Si par contre les classes sont génériques, tout pourrait être fait par la classe player qui modifierait ses variables en conséquences de celle de l'objet.
Voila voila, qu'est-ce que vous en pensez ?
(en fait, au passage, j'aurais plutôt du mettre une méthode uses que use xD mais bon, on a rien vu hein ^^)
Woufeil -> ouaip, je reviens ;) pourquoi, tu javate ? :P:
__________________________
Lorsque touts les arbres auront été coupés, Lorsque touts les animaux auront été chassés, Lorsque touts les poissons auront été pêchés;
Alors l'homme découvrira que l'argent ne se mange pas.
------ |_o/e _|a/a---------
Franchement, je pense que la meilleure conception qui soit (en POO bien sur) est la suivante :
ce qui résume en gros ce qu'à dit Woufeil. Faire des classes communes pour toutes tes potions, toutes tes armures me parait en effet trop rigide et ca deviendra de plus en plus difficile de rajouter de nouveau objets alors que la, avec cette méthode, c'est très simple... plus long car il faut écrire toutes les classes de bases mais ensuite ... ... plus de pb...
De plus, il est facile d'agrandir ce type de construction... Tu peux par exemple considéré qu'un objet (dans un jeu), c'est tout et n'importe quoi, par exemple des personnages (personnage dériverait de objet donc...) ce qui te permettrait d'interagir très facilement avec eux (comme si tu rammassait un objet) mais de manière différente (bien sur, on va mettre le perso dans le sac )...
Ensuite, pour identifier les types, peut être qu'écrire une méthode GetType() te permettrait de savoir facilement ce qu'est ton objet. Cet méthode serait virtuelle et écrite dès la 1ere classe de base (en virtuel donc) et réécrite pour chaque classe dérivée...
Exemple, d'après le schéma ci-dessus, le type des objets potion serait de la forme : Objet.NonConsommable.Potions (ou avec des flèches si tu préfères ... C'est une technique utilsée par C# (à la base, pas besoin de tout refaire))... Cela te permettrait de savoir avec exactitude de quel type est ton objet...
Pour revenir ensuite au problème de use... Ce que je t'ai dit tout à l'heure permet certes de faire des choses très compliquées, mais comme toujours, c'est facultatif... Tu peux tout aussi bien utiliser la technique que je t'ai décrite pour simplement boire une potion (sans tenir compte de tout un tas de paramètres (c'est çà qui est facultatif )) ou pour décapiter un gars à grand coup de hache ... C'est une méthode très générique mais qui te permet de la préciser dans chacune des classes l'exploitant.
__________________________
Sujet résolu ? Pensez à mettre le tag
Un problème en C# ? Vérifiez celui-ci n'est pas déjà résolu dans la FAQ et que le sujet n'est pas traité parmis les tutoriaux ou les articles avant de poster dans le forum C#.
[quote]exemple, d'après le schéma ci-dessus, le type des objets potion serait de la forme : Objet.[b]NonConsommable[/b].Potions (ou avec des flèches si tu préfères ... C'est une technique utilsée par C# (à la base, pas besoin de tout refaire))... [/quote]
T'es sûr de toi Czayfaboo? :lol:
lovejava : ouais, je javate pour l'IUT, mais ça va, c'est assez facile ce qu'on fait :wink:
En fait, c'est surtout qu'on a aucun superviseur Java qui fais son boulot en ce moment donc tu es nécéssaire.
Pourquoi tu le fais pas en Java ton prog ? Qustion de performances ?
__________________________
[col=#0000FF]Woufeil[/col]
[img]http://perldition.org/images/perl.png[/img]
[img]http://www.developpez.net/forums/images/smilies/code.png[/img] et respectez [url=http://www.forum.moteurprog.com/bavardages/forum-msg-22857-1.htm]la charte[/url].
ERREUR BBCODE SUR CE MESSAGE : - La valeur de la balise "quote" n'est pas correcte !
lol, euh oui, je me suis un peu embrouillé sur le coup ... c'est consommable bien sur
__________________________
Sujet résolu ? Pensez à mettre le tag
Un problème en C# ? Vérifiez celui-ci n'est pas déjà résolu dans la FAQ et que le sujet n'est pas traité parmis les tutoriaux ou les articles avant de poster dans le forum C#.
En fait ouai j'avais pensé à ça czayfaboo mais jusqu'à ce qu'on me certifie le contraire, je pensais typeid/type_info plus propre ou moins "bidouillage". Tout bien réfléchi, en fait, les différents types de potions ne seront pas si nombreux que ça, surtout que je peux faire des types plus ou moins générique (si j'ai par exemple potion rouge & blanche qui rendent toutes les deux des vies mais pas le même nombre, je peux faire une classe commune).
Enfin bref, je vais me débrouiller.
Woufeil, c'est vrai j'ai fait une grande pause en prog et aussi sur MP mais je suis de retour, je vais essayer de tout remettre en place tant bien que mal. Sinon je fais mon prog en C++ par choix car mon but personnel est de mieux maîtriser le C++, en concevant un projet complet et utilisable à la fin, ce qui est mon premier en C++ alors qu'en Java ça n'est pas le cas. Mais t'inquiète pas, maintenant que j'suis en vacance (vive la seconde , dédicace à tous ceux qui bossent encore, héhé) je vais m'occuper un peu plus du forum.
Bon bah merci pour votre aide ^^ je pense que j'ai enfin une idée de ce que je vais faire à peu près. Restera "plus que" les donjons après mais heureusement comme Alp m'a montré, ils ont déjà fait un roman dessus dans ce forum alors je vais déjà m'en inspirer.
++ et bonne prog ;
p.s:tiens va falloir que je me mette aux C# un jour...
__________________________
Lorsque touts les arbres auront été coupés, Lorsque touts les animaux auront été chassés, Lorsque touts les poissons auront été pêchés;
Alors l'homme découvrira que l'argent ne se mange pas.
------ |_o/e _|a/a---------