Antecedentes
Hago desarrollo de juegos como un hobby, y estoy buscando una mejor manera de diseñarlos. Actualmente, estoy usando un enfoque OOP estándar (he estado haciendo desarrollo empresarial durante 8 años, por lo que viene de manera natural). Tomemos por ejemplo un "malo"
public class Baddie:AnimatedSprite //(or StaticSprite if needed, which inherit Sprite)
{
//sprite base will have things like what texture to use,
//what the current position is, the base Update/Draw/GetInput methods, etc..
//an AnimatedSprite contains helpers to animated the player while
//a StaticSprite is just one that will draw whatever texture is there
}
El problema
Digamos que estoy haciendo un juego de plataformas en 2D, y necesito al malo para poder saltar. Por lo general, lo que hago es agregar el código apropiado en los métodos Update / GetInput. Entonces, si necesito hacer que el jugador se arrastre, se agache, suba, etc., el código irá allí.
Si no tengo cuidado, esos métodos se desordenan, así que termino creando pares de métodos como este
CheckForJumpAction(Input input)
y DoJump()
CheckforDuckAction(Input input)
y DoDuck()
entonces GetInput parece
public void DoInput(Input input)
{
CheckForJumpAction(input);
CheckForDuckAction(input);
}
y la actualización se ve así
public void Update()
{
DoJump();
DoDuck();
}
Si voy y creo otro juego donde el jugador necesita saltar y agacharse, generalmente entro en un juego que tiene la funcionalidad y lo copio. Desordenado, lo sé. Por eso estoy buscando algo mejor.
¿Solución?
Realmente me gusta cómo Blend tiene comportamientos que puedo adjuntar a un elemento. He estado pensando en usar el mismo concepto en mis juegos. Así que veamos los mismos ejemplos.
Crearía un objeto de comportamiento base
public class Behavior
{
public void Update()
Public void GetInput()
}
Y puedo crear comportamientos usando eso. JumpBehavior:Behavior
yDuckBehavior:Behavior
Luego puedo agregar una colección de comportamientos a la base de Sprite y agregar lo que necesito a cada entidad.
public class Baddie:AnimatedSprite
{
public Baddie()
{
this.behaviors = new Behavior[2];
this.behaviors[0] = new JumpBehavior();
//etc...
}
public void Update()
{
//behaviors.update
}
public GetInput()
{
//behaviors.getinput
}
}
Así que ahora, si quisiera usar Jump and Duck en muchos juegos, simplemente puedo traer los comportamientos. Incluso podría hacer una biblioteca para los comunes.
¿Funciona?
Lo que no puedo entender es cómo compartir el estado entre ellos. Mirando a Jump and Duck, ambos afectan no solo la porción actual de la textura que se está dibujando, sino también el estado del jugador. (Jump aplicará una cantidad decreciente de fuerza ascendente con el tiempo, mientras que el pato solo detendrá el movimiento, cambiará la textura y el tamaño de colisión del malo.
¿Cómo puedo unir esto para que funcione? ¿Debo crear propiedades de dependencia entre los comportamientos? ¿Debería tener cada comportamiento saber sobre el padre y modificarlo directamente? Una cosa que pensé fue poder pasar un delegado a cada comportamiento para que se ejecute cuando se activa.
Estoy seguro de que hay más problemas que estoy revisando, pero el propósito es que pueda reutilizar fácilmente estos comportamientos entre juegos y entidades en el mismo juego.
Así que te lo entrego a ti. ¿Le gustaría explicar cómo / si esto se puede hacer? Tienes una mejor idea? Soy todo oídos.