Verwalten / Aktualisieren einer großen Anzahl von Spielerzuständen

7

Ich entwickle ein Kampfspiel, um meine Fähigkeiten in Java zu üben, und ich würde gerne wissen, was der beste Ansatz wäre, um herauszufinden, wie man die Anzahl der Zustände, die ein Spieler haben kann, leicht erweitern kann, ohne mit einer großen Menge an Code herumzuspielen. Mit einer kleinen Anzahl von Zuständen wie inAir, isHurt, isRunning kann ich alle Bedingungen, die ich benötige, hart codieren. Dinge wie "Springen" können nur auftreten, wenn "! InAir" usw. Für mein Projekt gibt es jedoch eine große Anzahl von Staaten, die ich nicht organisieren kann. Hier ist ein kleines Diagramm, das ich neu gezeichnet habe:

FSM

Mein Ansatz ist es, eine Aufzählung namens State zu erstellen und einen Wechsel zwischen ihnen durchzuführen. Ich bin mir nicht sicher, ob dies ein guter Weg ist, und ich versuche, eine bessere Methode zu lernen, wenn es welche gibt.

Michael Choi
quelle
4
Ein Lesen davon kann helfen, hoffentlich kommt eine detailliertere Antwort. Ich bin zu interessiert.
Lozzajp
Was sind die roten Pfeile? Kannst du dich beim Gehen nicht umdrehen?
1000 ml
Und wie gehen Sie derzeit mit Eingaben und Übergängen zwischen Zuständen um?
1000 ml

Antworten:

1

Ich würde es ähnlich organisieren, wie Sie es beschrieben haben.

Pseudocode:

enum totalStates = {STATE_1, STATE_2, ..., STATE_N};
totalStates state = totalStates.STATE_1;

void Update() {

    switch (state) {

        case totalStates.STATE_1:
            // update STATE_1
            break;

        // ... other states ...

    }

}

bool initState(totalStates newState) {

    switch (newState) {

        case totalStates.STATE_1:
            // check if the object's data allow the object to move to STATE_1
            if (canState1) {
                state = totalStates.STATE_1;
                return true;
            }
            return false;

        // ... other states ...
    }

Jedes Mal, wenn Sie möchten, dass Ihr Objekt in einen neuen Zustand versetzt wird, rufen Sie initState(totalStates.STATE_2)(oder einen anderen Zustand) auf, und wenn es zurückkehrt, hat sich truedas Objekt in diesen Zustand bewegt. Wenn es zurückkehrt false, weigert sich das Objekt, in diesen Zustand zu wechseln. Wenn sich beispielsweise ein Charakter in der Luft befindet und der Benutzer die Sprungtaste erneut drückt, fordert das Programm das Objekt auf, in den Sprungzustand zu wechseln, das Objekt sieht, dass es sich bereits in der Luft befindet, und lehnt ab.

Wenn Sie sich Sorgen machen, skalierbar und organisatorisch zu sein, weil Sie zu viele Status haben, können Sie die Statuslogik trennen, um verschiedene Funktionen wie updateState1()oder updateState2()usw. usw. zu verwenden.

TomTsagk
quelle
1

Alternativ können Sie versuchen, Ihren Code so umzustrukturieren, dass einige verschiedene Statuskategorien unabhängig voneinander festgelegt werden, z. B. Haltung, Bewegung, IsDazed usw. Außerdem können Sie ein Status- / SubState-System erstellen, in dem der SubState darüber hinaus weitere Details bereitstellt der allgemeine Staat.

CourageousPotato
quelle