Hintergrund
Ich mache Spieleentwicklung als Hobby und suche nach einer besseren Möglichkeit, sie zu entwerfen. Derzeit verwende ich einen Standard-OOP-Ansatz (ich mache seit 8 Jahren Unternehmensentwicklung, daher erfolgt dies nicht mehr). Nehmen Sie zum Beispiel einen "Bösewicht"
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
}
Das Problem
Nehmen wir an, ich mache einen 2D-Plattformer und brauche den Bösewicht, um springen zu können. Normalerweise füge ich den entsprechenden Code in die Update / GetInput-Methoden ein. Wenn ich dann den Spieler kriechen, ducken, klettern lassen muss, wird der Code dorthin gehen.
Wenn ich nicht aufpasse, werden diese Methoden unübersichtlich, sodass ich am Ende Methodenpaare wie dieses erstelle
CheckForJumpAction(Input input)
und DoJump()
CheckforDuckAction(Input input)
und DoDuck()
GetInput sieht also so aus
public void DoInput(Input input)
{
CheckForJumpAction(input);
CheckForDuckAction(input);
}
und Update sieht aus wie
public void Update()
{
DoJump();
DoDuck();
}
Wenn ich ein anderes Spiel erstelle , in dem der Spieler springen und sich ducken muss, gehe ich normalerweise in ein Spiel mit der Funktionalität und kopiere es. Chaotisch, ich weiß. Deshalb suche ich etwas Besseres.
Lösung?
Ich mag es wirklich, wie Blend Verhaltensweisen hat, die ich an ein Element anhängen kann. Ich habe darüber nachgedacht, dasselbe Konzept in meinen Spielen zu verwenden. Schauen wir uns also dieselben Beispiele an.
Ich würde ein Basis-Verhaltensobjekt erstellen
public class Behavior
{
public void Update()
Public void GetInput()
}
Und damit kann ich Verhaltensweisen erzeugen. JumpBehavior:Behavior
undDuckBehavior:Behavior
Ich kann dann der Sprite-Basis eine Sammlung von Verhaltensweisen hinzufügen und jeder Entität hinzufügen, was ich brauche.
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
}
}
Wenn ich jetzt Jump and Duck in vielen Spielen verwenden wollte, kann ich das Verhalten einfach überdenken. Ich könnte sogar eine Bibliothek für die üblichen machen.
Funktioniert es?
Was ich nicht herausfinden kann, ist, wie man den Zustand zwischen ihnen teilt. Bei Jump und Duck wirken sich beide nicht nur auf den aktuellen Teil der gezeichneten Textur aus, sondern auch auf den Status des Spielers. (Der Sprung wird mit der Zeit eine abnehmende Menge an Aufwärtskraft aufbringen, während die Ente nur die Bewegung stoppt, die Textur und die Kollisionsgröße des Bösewichts ändert.
Wie kann ich das zusammenbinden, damit es funktioniert? Soll ich Abhängigkeitseigenschaften zwischen den Verhaltensweisen erstellen? Sollte ich jedes Verhalten über das Elternteil wissen lassen und es direkt ändern? Eine Sache, die ich dachte, war, einen Delegaten in jedes Verhalten zu übergeben, um ausgeführt zu werden, wenn es ausgelöst wird.
Ich bin mir sicher, dass es weitere Probleme gibt, über die ich nachdenke, aber der gesamte Zweck besteht darin, dass ich diese Verhaltensweisen zwischen Spielen und Entitäten im selben Spiel problemlos wiederverwenden kann.
Also übergebe ich es dir. Möchten Sie erklären, wie / ob dies möglich ist? Hast du eine bessere Idee? Ich bin ganz Ohr.