Contexte
Je fais du développement de jeux comme passe-temps et je cherche une meilleure façon de les concevoir. Actuellement, j'utilise une approche POO standard (je fais du développement d'entreprise depuis 8 ans donc ça vient de façon non-systématique). Prenons par exemple un "méchant"
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
}
Le problème
Disons que je fais un jeu de plateforme 2D et que j'ai besoin du méchant pour pouvoir sauter. Habituellement, ce que je fais est d'ajouter le code approprié dans les méthodes Update / GetInput. Ensuite, si j'ai besoin de faire ramper, canarder, grimper, etc ... le code y ira.
Si je ne fais pas attention, ces méthodes sont encombrées, donc je finis par créer des paires de méthodes comme celle-ci
CheckForJumpAction(Input input)
et DoJump()
CheckforDuckAction(Input input)
et DoDuck()
donc GetInput ressemble
public void DoInput(Input input)
{
CheckForJumpAction(input);
CheckForDuckAction(input);
}
et la mise à jour ressemble
public void Update()
{
DoJump();
DoDuck();
}
Si je vais créer un autre jeu où le joueur doit sauter et esquiver, je vais généralement dans un jeu qui a la fonctionnalité et je le copie. Messy, je sais. C'est pourquoi je recherche quelque chose de mieux.
Solution?
J'aime vraiment comment Blend a des comportements que je peux attacher à un élément. J'ai pensé à utiliser le même concept dans mes jeux. Regardons donc les mêmes exemples.
Je créerais un objet de comportement de base
public class Behavior
{
public void Update()
Public void GetInput()
}
Et je peux créer des comportements en utilisant ça. JumpBehavior:Behavior
etDuckBehavior:Behavior
Je peux ensuite ajouter une collection de comportements à la base Sprite et ajouter ce dont j'ai besoin à chaque entité.
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
}
}
Alors maintenant, si je voulais utiliser Jump and Duck dans de nombreux jeux, je peux simplement apporter les comportements. Je pourrais même faire une bibliothèque pour les plus communes.
Est-ce que ça marche?
Ce que je ne peux pas comprendre, c'est comment partager l'état entre eux. En regardant Jump et Duck, les deux affectent non seulement la partie actuelle de la texture en cours de dessin, mais aussi l'état du joueur. (Le saut va appliquer une quantité décroissante de force ascendante au fil du temps, tandis que le canard va simplement arrêter le mouvement, changer la texture et la taille de la collision du méchant.
Comment puis-je lier cela ensemble pour que cela fonctionne? Dois-je créer des propriétés de dépendance entre les comportements? Dois-je faire connaître chaque comportement au parent et le modifier directement? Une chose que je pensais était de pouvoir passer un délégué dans chaque comportement pour être exécuté lorsqu'il est déclenché.
Je suis sûr qu'il y a plus de problèmes que je regarde, mais le but est que je puisse facilement réutiliser ces comportements entre les jeux et les entités dans le même jeu.
Je vous cède donc la parole. Voulez-vous expliquer comment / si cela peut être fait? As-tu une meilleure idée? Je suis tout ouïe.