7
votes

Considérations de conception pour transformer temporairement un joueur en un animal dans un jeu de rôle

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


0 commentaires

7 Réponses :


1
votes

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. XXX

Ignorant l'horriblement nommé classe "standarddruid", je 'J'espère que vous pouvez voir où je vais avec ceci :)

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.


1 commentaires

J'ai presque pensé que cela fonctionnerait! Mais pour mon cas, cela ne fonctionnera pas. Par exemple, druid dérive de caractère donc je pouvais descendre druide à un caractère avant de décorer avec guépard . Mais si je fais que je vais perdre des informations sur le druid , par exemple, ce qui précise que le personnage a actuellement mémorisé.



0
votes

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.");
    }
}


0 commentaires

10
votes

Vous ne devez pas avoir vos sorts et vos compétences en tant que méthode de la classe. Ils devraient être une collection d'objets de sorts et de compétences accessibles via l'interface de caractère (ou éventuellement créature). Ensuite, votre CheetAform pourrait remplacer les méthodes Getkills GetSpells pour renvoyer une nouvelle collection modifiée de compétences appropriées.


2 commentaires

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"?



0
votes

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.


0 commentaires

0
votes

Comment de cela? XXX PRE>

et par exemple: P>

class Spell : ISkill {}

class SpellState : ISkillState {}


0 commentaires

1
votes

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());


5 commentaires

Je commence vraiment à creuser cette approche! Une autre chose que je peux faire est de faire le personnage de caractères A list . Ensuite, je peux même permettre aux caractères de sous-classement afin de pouvoir conserver toutes les compétences / sorts qu'ils sous-classent. Je vais le prototyper et voir comment ça se passe.


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 J'utilise Liste pour le mtype . Ensuite, je pose toutes les compétences / sorts à l'intérieur des décorateurs (comme mon Cheetahform 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 . 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) .



1
votes

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

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.

Première lecture Vous devriez faire est http://www.devaster.net/ Articles / Oo-Game-Design /

Alors votre voyage vers le monde de la conception du jeu commencera.


0 commentaires