Rundenbasierende Kämpfe

  • Zuerst einmal finde ich deine Surveillance Camera Madness ziemlich genial^^ Hab da soeben mal ein bisschen reingelurrt :D


    Okay, zum Beitrag:
    In vielen (vor allem alten) RPG's werden die Kämpfe ja rundenbasierend ausgetragen. Wie genau wird so etwas gemacht? Die Attacken werden ja über Widgets (Buttons) ausgeführt aber wie bekomme ich es zum funktionieren dass dann der Charakter die bestimmte Animation ausführt? Ganz zu schweigen von der Auswahl des Gegners den er angreifen soll? Ich habe bis jetzt noch kein Tutorial gefunden welches mir davon die Basics zeigen kann. Nur kurze Prototype- oder WIP Videos

  • Oke, das ist nicht leicht zu beantworten, da man es auf verschiedene Arten machen kann. Nehmen wir Golden Sun als Beispiel.


    Du hast 4 Charaktere + 2 Gegner. Du hast ein Widget mit Buttons.


    Hier ein Beispiel, wie soetwas ablaufen könnte:


    Deine Runde beginnt. Dein Charakter1 ist zuerst dran. Du wählst jetzt in deinem Auswahl-Widget aus "Zauber/Feuerball". Hast du diese Auswahl getroffen muss das Widget zu Character1 casten, und ihm beispielsweise eine Variable "nächste Aktion" am besten in Form eines Enums (Enumeration/Aufzählung) übergeben. Enumerationen sind gut um nicht durcheinander zu kommen.
    Außerdem muss bei bestimmten Attacken ein "Target" übergeben werden. Nachdem du also den "Zauber/Feuerball" ausgewählt hast, muss der Spieler ein Target auswählen. Dafür benötigst du auch eine Eingabe Routine (z.B. klicken auf den Gegner). Dieses Target wird ebenfalls zu Charakter1 übertragen.



    Für die anderen Charaktere wird das wiederholt. Jeder Charakter verfügt nun über die Information, was er tun soll.


    Die gegnerische KI macht eigentlich genau das gleiche, und legt für jeden gegnerischen Charakter ebenfalls eine "nächste Aktion" + "Target" fest. Das kann je nach komplexität der KI entweder zufällig passieren, oder nach bestimmten Mustern.



    Wenn alle Charaktere ihre nächste Aktion wissen, ist die Auswahlphase beendet und sie beginnen nun nach einer Reihenfolge (eventuell höhere init zuerst) ihre Aktionen auszuführen.
    Character1 führt zum Beispiel den "Zauber/Feuerball" aus, indem er sich zu dem Target dreht, und seine Zauberanimation abspielt. Die Zauberanimation wird durch einen Animation-Blueprint stattfinden, und an der richtigen Stelle ein "Anim-Notify" Event triggern, welches den Feuerball (oder bei anderen Zaubern mit dieser Animation etwas anderes) abschießt.


    Der Gegner greift eventuell an, indem er sich zu dem Target umdreht, hinläuft, und es dann schlägt. Am besten regelt man die Bewegung im Character, und sobald er am Ziel angekommen ist, wird einfach eine Variable wie "Angriff1" an den AnimBP gesendet. Dann wird von der Laufen in die Angriff1 Animation geschaltet. Das wiederrum funktioniert mit StateMachines wunderbar.


    Wenn alle Charaktere das gemacht haben, geht es wieder von vorne los.


    Das ist ganz klar nur ein ganz grober Ablauf. Man kann auch viel verändern, beispielsweise könnte man die Charaktere auch anders verwalten im PlayerController, GameState oder GameInstance, dann kommen natürlich noch Ausrüstungsgegenstände und Stats dazu, die den Schaden beeinflussen. Und plötzlich wird das ganze sehr kompliziert und unübersichtlich. Am besten ist also, man macht sich gedanken, und dann versucht man es einfach umzusetzen. Einen genauen Bauplan dafür kann dir aber leider keiner geben, und es gibt keine "Perfekte" Lösung ;)