Je travaille sur un jeu de rôle pour le plaisir et de pratiquer des modèles de conception. Je voudrais que les joueurs puissent se transformer en différents animaux. Par exemple, un druide pourrait être capable de se transformer en guépard. À l'heure actuelle, je prévois d'utiliser le motif de décorateur pour le faire, mais ma question est - comment puis-je le faire pour que lorsqu'un druide soit dans la forme de guépard, ils ne peuvent accéder que des compétences pour le guépard? En d'autres termes, ils ne devraient pas être en mesure d'accéder à leurs compétences druides normales.
Utilisation du motif de décorateur Il apparaît que même dans le guépard forme mon druide pourra accéder à leurs compétences druides normales. P>
Druid myDruid = new Druid(); myDruid.LightHeal(myDruid); // casting light heal here is fine myDruid = new CheetahForm(myDruid); myDruid.LightHeal(myDruid); // casting here should not be allowed
7 Réponses :
Peut-être plutôt que de placer la compétence pour un druide dans la classe druide, vous pouvez déplacer cette compétence définie dans un décorateur lui-même. Ignorant l'horriblement nommé classe "standarddruid", je 'J'espère que vous pouvez voir où je vais avec ceci :) p> Il y a des majuscules à cet arrangement, à savoir que tout votre code de compétence sera contenu constamment à l'intérieur des décorateurs, plutôt que de moitié à l'intérieur du classe druide originale et les compétences restantes dans les décorateurs. Si vous deviez avoir une autre classe qui pourrait se transformer dans une druide, vous pourriez facilement le faire sans aucune duplication de code. P> P>
J'ai presque pensé que cela fonctionnerait! Mais pour mon cas, cela ne fonctionnera pas. Par exemple, druid code> dérive de
caractère code> donc je pouvais descendre
druide code> à un
caractère code> avant de décorer avec
guépard code>. Mais si je fais que je vais perdre des informations sur le
druid code>, par exemple, ce qui précise que le personnage a actuellement mémorisé.
Je résoudrais cela en modifiant la méthode lighthheal code> à virtuelle, puis la remplacer dans la classe
cheetahform code> pour lancer une exception ou afficher un message à l'utilisateur qui ils ne peuvent pas le faire maintenant:
class Druid : Character
{
// many cool druid skills and spells
virtual void LightHeal(Character target) { }
}
abstract class CharacterDecorator : Character
{
Character DecoratedCharacter;
}
class CheetahForm : CharacterDecorator
{
Character DecoratedCharacter;
public CheetahDecorator(Character decoratedCharacter)
{
DecoratedCharacter= decoratedCharacter;
}
// many cool cheetah related skills
void CheetahRun()
{
// let player move very fast
}
override void LightHeal(Character target)
{
ShowPlayerMessage("You cannot do that while shape shifted.");
}
}
J'aime beaucoup cette idée. Je l'ai fait pour un match de retour quand j'étais à l'université et ça marche bien. L'interface utilisateur peuplée de manière dynamique chaque fois qu'un ensemble de compétences a changé.
"Vous ne pouvez pas" ou "tu ne devrais pas"?
Je voudrais juste créer une propriété dans la classe Druid "Formulaire" et faire un chèque Si, lors de la mise en ovulation, si le druide est transformé ou non. P>
Comment de cela? et par exemple: P> class Spell : ISkill {}
class SpellState : ISkillState {}
Au lieu de faire de la druide une classe dérivée de caractère, envisagez d'utiliser le type objet modèle. Premièrement, diviser les compétences spécifiques à la classe de caractères dans leurs propres objets:
CharacterType druid = new CharacterType(); druid.Skills.Add(new LightHeal()); CharacterType cheetah = new CharacterType(); cheetah.Skills.Add(new CheetahRun());
Je commence vraiment à creuser cette approche! Une autre chose que je peux faire est de faire le personnage de caractères code> A
list
Oui, c'est exactement juste. Une fois que vous utilisez des objets de type, vous pouvez implémenter un héritage unique ou même multiple avec eux. Le ciel est la limite.
S'il vous plaît terminer votre livre de la programmation de jeu Livre de modèle afin que je puisse acheter une copie! :)
Ok, j'ai pris une approche légèrement différente à ce sujet. Au lieu d'utiliser CaractyType Code> J'utilise
Liste
mtype code>. Ensuite, je pose toutes les compétences / sorts à l'intérieur des décorateurs (comme mon
Cheetahform code> décorateur). Maintenant, je peux décorer mes personnages pour leur donner différentes compétences / sorts au lieu de simplement définir leur
MTYPE code>. Je ne sais pas si j'aime bien si j'aime bien ... Cela a du sens pour moi de le faire de cette façon, mais cela ressemble à je le rend plus compliqué qu'il ne devait être.
Avec un objet de type, vous pouvez accomplir la même chose en faisant simplement si (mtype! = Guépard) code>.
Désolé de vous informer des gars, mais vous avez tous faux d'essayer d'utiliser un marteau sur la chose qui n'est pas un ongle :-p p>
Pour résoudre votre problème, vous devez aller au-delà de OOP car OOP ne peut pas résoudre ce problème. Jetez un coup d'œil à des systèmes d'entité / systèmes de composants. P>
Première lecture Vous devriez faire est http://www.devaster.net/ Articles / Oo-Game-Design / P>
Alors votre voyage vers le monde de la conception du jeu commencera. P>