Es geht um folgendes:
In einem Spiel gibt es Fähigkeiten mit verschiedenen Zielen, wie z.B. Fähigkeiten, die eine Koordinate brauchen (Bewegung, der in RTS Spielen berühmte Angriffbefehl), ein einzelnes Ziel (ein normaler Angriff, ein Feuerpfeil), eine Koordinate brauchen und dann mehrere Ziele treffen (Ein Feuerregen z.B.), die auf sich selbst gerichtet werden (Heilung), die auf sich selbst gerichtet werden aber mehrere Objekte treffen, die ein Ziel treffen und dann weiterspringen, usw. ich denke ich habe genug aufgezählt
Diese Fähigkeiten brauchen jetzt auch noch unterschiedliche Eingaben und entweder ein einzelnes Ziel oder die Liste aller Objekte im Effekt Gebiet oder auch garnichts.
Mein erster Ansatz für ein RTS Spiel war folgender:
Maximal wird das drücken einer Taste und ein Mausklick für jede Fähigkeit benötigt.
Eine Fähigkeit wird über eine Taste ausgewählt und auf den Status Aktiv gesetzt (bzw. ich hab den Code der Taste einfach gespeichert).
In Fall eines Rechtsklicks wird dies wieder deaktiviert, im Falle eines Linksklicks geprüft, ob die Eingabe sinnvoll ist (Eine Einheit z.B., wenn die Fähigkeit nur ein Ziel erlaubt). Wenn sie sinvoll ist, wird sie ausgeführt, ansonsten wird weiter auf eine sinvolle Eingabe gewartet.
Jede Fähigkeit hat in ihrer execute Methode einen Parameter für die komplette Einheitenliste, sodass im Fall, dass mehrere Einheiten getroffen werden sollen, die Einheiten heraus gesucht werden sollten, die die Bedingung der Fähigkeit erfüllen.
Auch für einzelne Ziele wird dieser Ansatz gewählt, jede Einheite hat eine Kennnummer, mit welcher die Einheit aus der Liste gesucht wird.
Andere Fähigkeiten ignorieren die Liste.
Dann sollten wir in der Schule ein Konsolen Adventure/RPG entwickeln.
Der Ansatz von oben ließ sich nicht einfach so übernehmen, da ich unterschiedliche Eingaben brauchte.
Für eine Koordinate sind zwei Eingaben nötig (Ich habe das ganze so umgesetzt, das immer nur eine Eingabe, ein ganze Zahl, eingeben wird), für einzelne Ziele eine, für selbstgerichtete Fähigkeiten keine. Von einem interface habe ich dann verschiedene Grundfähigkeiten abgeleitet, die eine Methode implementieren, die den Typ der Fähigkeit (Einzelziel, Gebietseffekt..) zurückgibt. Diese Klassen deklarierten auch Methoden, die nötig waren um das Ziel zu übernehmen, da ich der execute () Methode keinen Parameter für die Liste der Objekte übernimmt (bin mir nicht sicher, ob das überhaupt ein guter Ansatz ist). Da die Zeit etwas knapp war, hab ich dann einfach je nach Typ runtergecastet, die Eingabe empfangen, das Ziel übergeben und dann ausgeführt.
Natürlich ist dies ein sehr problematischer Ansatz, insbesondere wenn Fähigkeiten gemischtes Verhalten aufweisen sollen und ich bin nicht besonders zufrieden damit.
Der erste Ansatz stellt mich aber auch nicht zufrieden, kennt jemand eine bessere Lösung?
E: Hab ganz vergessen zu sagen, dass das Konsolenspiel noch von uns erweitert werden soll, auch die Möglichekeit eines GUIs besteht.
Das Kampffeld wird wie ein Schachbrett aufgebaut sein, im Prinzip könnte man jetzt hier wieder den ersten Ansatz wählen. Ich wäre allerdings an einem allgemeinen interressiert, der überall eingesetzt werden kann.