Estoy trabajando en un juego de rol para divertirme y practicar patrones de diseño. Me gustaría que los jugadores puedan transformarse en diferentes animales. Por ejemplo, un druida podría ser capaz de cambiar de turno a un guepardo. En este momento estoy planeando usar el patrón de decorador para hacer esto, pero mi pregunta es: ¿cómo lo hago para que cuando un druida esté en forma de guepardo, solo puedan acceder a las habilidades del guepardo? En otras palabras, no deberían poder acceder a sus habilidades Druidas normales.Consideraciones de diseño para transformar temporalmente a un jugador en un animal en un juego de rol
Usando el patrón de decorador parece que incluso en la forma de guepardo mi druida podrá acceder a sus habilidades normales de druida.
class Druid : Character
{
// many cool druid skills and spells
void LightHeal(Character target) { }
}
abstract class CharacterDecorator : Character
{
Character DecoratedCharacter;
}
class CheetahForm : CharacterDecorator
{
Character DecoratedCharacter;
public CheetahForm(Character decoratedCharacter)
{
DecoratedCharacter= decoratedCharacter;
}
// many cool cheetah related skills
void CheetahRun()
{
// let player move very fast
}
}
ahora utilizando las clases
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
Hmmmm ... ahora que lo pienso, se myDruid ser incapaz de nosotros los Druid
clase hechizos/habilidades a menos que se coló abajo a la clase? Pero incluso si ese es el caso, ¿existe una mejor manera de asegurar que myDruid
en este momento está bloqueada desde todos Druid
hechizos relacionados/habilidades hasta que es puesto de nuevo a un Druid
(ya que actualmente está en CheetahForm
)
Me gusta mucho esta idea. Hice esto para un juego cuando estaba en la universidad, y funciona bien. La interfaz de usuario se llena dinámicamente cada vez que se cambia un conjunto de habilidades. – Codesleuth
'No puedes' o 'No deberías'? –
@ mark.withers - Punto justo de LOL Voy a actualizar mi publicación :) – willcodejavaforfood