Survival, Hunger und Durst System

  • Ich habe ein Video gefunden, welches relativ gut erklärt, wie man ohne Skripts/Plugins ein Hunger/Durst/Schlaf-System einbaut.


    Hier mal das Video (sind 3 Teile).


    Ich hab das alles so nachgebaut (na gut, fast - den Schlaf brauch ich nicht) und es funktioniert auch alles so, wie es soll.


    Problem ist nur, dass ich das ganze um eine Kleinigkeit erweitern möchte und dafür müsste ich wissen, wie das ganze denn nun überhaupt funktioniert :/. Ich sehe, DASS es funktioniert, aber mir will nicht in den Kopf, WIE das geht :D:D


    Mal am Beispiel vom Hunger. Hier werden folgende Variablen erstellt:


    Als Common Event wenn die Map beim Spielstart geladen wird:

    Hunger Defizit Maximal = -288 (nicht wundern, in dem Video ist es weniger, aber mein Balken ist größer)

    Schritte Hunger = Schritte (Spieldaten)


    Dann im Common Event als paralleler Prozess, während das Spiel also läuft:

    Differenz Hunger = Schritte (Spieldaten)

    Differenz Hunger - = Schritte Hunger

    Differenz Hunger /= 1 (nur für Testzwecke auf 1, soll eigentlich auf 4 oder sowas, damit der Balken nicht so schnell sinkt)

    Hunger = Hunger2

    Hunger - = Differenz Hunger


    Und dann natürlich noch die Abfragen, damit der Hunger nicht über 0 und nicht unter -288 kommt.


    Was passiert hier genau? Warum funktioniert das?

    Theoretisch müssten doch die Variablen "Schritte Hunger" und "Differenz Hunger" permanent auf dem gleichen Wert sein? Das Spiel zählt im Hintergrund meine gelaufenen Schritte. Sind es 10, sind beide Variablen 10. Wenn ich 20 Schritte gelaufen bin, haben beide Variablen den Wert 20.

    Wenn ich aber nun ingame F9 drücke und mir die Werte angucke, dann sind die Schritte immer auf 0.

    Und woher bekommen eigentlich "Hunger" und "Hunger2" ihre Werte? Ich stelle "Hunger = Hunger2", aber es existiert keine Variable "Hunger2", also müsste das doch auch 0 sein. Also ist Hunger dann auch 0 und davon subtrahiere ich dann die Differenz, das ist ja schön und gut, aber was macht dann der Hunger2....

    Irgendwie steh ich hier voll auf dem Schlauch :?::?:


    Mein Ziel ist eigentlich folgendes: Wenn Hunger oder Durst auf 0 gesunken sind (hoppla, -288 meine ich natürlich, also wenn der Balken leer ist), soll nicht gleich das Game Over kommen, sondern die HP sollen dann langsam bis auf 0 runtergezogen werden. Ich habe das gesamte Hunger-System kopiert und entsprechend abgewandelt mit einer neuen Lebens-Variable und soweit funktioniert das auch. Ich habe nun eine Variable "Differenz Leben" (nach dem gleichen Muster wie oben), die ich nun von den aktuellen HP abziehen möchte. Nun macht der Maker das aber natürlich 60x pro Sekunde und ich bin ruckzuck tot. Wie umgehe ich das? Die HP sollen ja auch nur dann abgezogen werden, wenn ich laufe, so wie es mit Hunger und Durst ja auch funktioniert.


    Jemand ne Idee?




  • Mach doch einfach eine weitere Abfrage einbauen.


    Nimmst dir die Schritte/Koordinaten und fragst im Sekundentakt ab ob eine Änderung vorhanden ist.

    Ist eine vorhanden, wird noch abgefragt ob die Durst/Hunger-Anzeige auf Null ist.


    Wenn alles erfüllt wird, sinkt die Lebensanzeige um den von dir gewünschten Wert.

  • Danke dass du versuchst mir zu helfen :-)

    Wäre das aber nicht so ziemlich das gleiche, was ich momentan mache? Ich zähle die Schritte und wenn der Hungerbalken leer ist, werden HP abgezogen. Aber halt zu schnell auf einmal, so dass man in wenigen Sekunden tot ist. Das ist halt mein Problem.

  • Also ich habe mir das Video nicht angeschaut, hab dafür jetzt leider eher weniger Zeit, aber ich denke der Fehler liegt vllt (sehr wahrscheinlich) in der Else-Funktion von dir.


    Du bringst die Variable "alte Schritte Leben" solange dazu, die Schrite abzufragen, bis du ein Switch aktivierst.

    Dadurch wird die Lebenverringerung zwar eingeleitet, aber die Schritte (also die alten) nicht weiter aktualisiert, weil die Else-Funktion durch diesen Switch geblockt ist.

    Und dadurch das die Schritte nicht aktualisiert werden wird zum einen das Leben permanent heruntergesetzt und zum anderen noch beim bewegen die Menge erhöht, die verringert wird.

    Aber das erste ist eher das Problem xD


    Im Grunde passiert dann das hier wenn du dich bewegst:


    Im Stillstand:

    (10 - 10) / 1= 0

    Nach einem Schritt:

    (10 - 11) / 1= 1

    Nach zwei Schritten:

    (10 - 12) / 1= 2


    Und allgemein verlierst du halt Leben auch wenn du dich nicht bewegst, da du immer mindestens 1 hast nach dem ersten Schritt.


    Hier mal einen Lösungsansatz:


    Häng die Variable "alte Schritte leben = Schritte" unter den Befehl "HP ändern" in den If-Befehl rein.

  • Du bringst die Variable "alte Schritte Leben" solange dazu, die Schrite abzufragen, bis du ein Switch aktivierst.

    Dadurch wird die Lebenverringerung zwar eingeleitet, aber die Schritte (also die alten) nicht weiter aktualisiert, weil die Else-Funktion durch diesen Switch geblockt ist.

    Und dadurch das die Schritte nicht aktualisiert werden wird zum einen das Leben permanent heruntergesetzt und zum anderen noch beim bewegen die Menge erhöht, die verringert wird.

    Also jetzt versteh ich noch weniger :/

    Ich habe mit Absicht die "alten Schritte" eingebaut, weil der Schrittzähler ja aktuell immer mitzählt und um eine Differenz zu errechnen, brauche ich den alten Wert. Beispiel, ich bin 500 Schritte gelaufen, bevor der Hungerbalken leer ist. Dann will ich ja von den 500 an weiterzählen und nicht gleich die 500 von den HP abziehen. Darum die extra Variable.


    Was ich jetzt aber noch viel weniger verstehe, ist, dass es tatsächlich funktioniert, wenn ich es so mache, wie du es gesagt hast.


    Also, was soll ich sagen... Vielen Dank für deine Hilfe :D:D

    Immerhin läuft es jetzt. Verstehen tu ich allerdings immer weniger XDD

  • Du hast die "Aktualisierung" durch den Else-Befehl geblockt, bzw. du willst ja einen Schritt speichern und prüfen ob der Held sich bewegt hat.


    Du weißt ja wie ein If-Else-Befehl funktioniert.


    If ist ja die Abfrage, in deinem Fall der Switch welcher das "hungern" einleitet.

    Sobald dieser an ist, wird der Else-Befehl gesperrt.


    Um dein Vorhaben zu verwirklicken brauchst du 2 Werte, die jetzige und die "alte" Position des Helden bzw. den Schrittzähler.

    Du rufst über den Else-Befehl dauerhaft die "alte" Position ab, die du für die Differenz brauchst.


    Sobald der Switch aber aktiviert ist, wird diese Position nicht mehr abgefragt und somit bleibt die "alte" Position immer die gleiche, während die neue sich vermehrt.

    Das ganze habe ich hier ja schon mal gezeigt:

    Die erste Zahl ist die Position "Alt" und die 2 Zahl ist die Position "neu".


    Dadurch das du nach einem Schritt immer einen Wert von 1 oder mehr hast führt zur Tatsache das du schnell verhungerst und stirbst, da du keine unterbrechung hast.

    Du hättest auch ein Wait von 1 Sekunde oder so einbauen können, dann würde das ganze aber nicht auf Schritten sondern auf der Zeit basieren.


    Hoffe das ist verständlich :D


    Btw. diese "/1" braucht man gar nicht, diese geteilt rechnen ist ja nur um die "Menge" des Verlustes zu regeln, aber wenn man immer nur "/1" rechnet ergibt das immer das gleiche, wie wenn du ohne rechnest ;)


    Auf jeden Fall gern geschehen :D


    -MrSerji

    Dieser Beitrag wurde bereits 2 Mal editiert, zuletzt von MrSerji ()

  • Vielen herzlichen Dank für die ausführliche Erklärung :-)


    Grundsätzlich weiß ich schon, wie if-then-else ect funktioniert. Und du selbst sagst ja auch, dass ich die alte Position brauche für die nachfolgenden Berechnungen. Aber genau da liegt mein Verständnisproblem. Anscheinend berechnet der Maker die Schritte anders.


    In deinem Beispiel müsste es eigentlich, nach meiner Logik, so sein:


    Im Stillstand:

    (10 - 10) / 1= 0

    Nach einem Schritt:


    (11 - 11) / 1= 0

    Nach zwei Schritten:


    (12 - 12) / 1= 0


    Aber ganz offensichtlich ist es das nicht. Obwohl beide Variablen mit den Schritten ständig hochgezählt werden MÜSSTEN, tun sie es nicht, sondern die eine zählt hoch, die andere nicht.

    Mit "beide Variablen" meine ich sowohl "Differenz Leben" als auch "alte Schritte Leben", weil beide per Systemdaten auf die aktuellen Schritte gesetzt werden. Aber anscheinend passiert da intern im Maker irgendwas anderes. Oder ich bin heute zu verknotet XD

  • Muss mich erst mal entschuldigen hab die Werte vertauscht, also die Erste Zahl ist die neue Position und die zweite Zahl ist die alte ^^

    Der Maker arbeitet Seriell die Liste ab. Heißt: Von Oben nach Unten.

    Durch Spezielle Befehle wie Labels oder Loops kann man das ganze etwas "varieren".


    Im Normalen Durchlauf sollte das so sein:


    Phase 1: Stillstand
    (10 - 10) / 1 = 0

    Phase 1: Schritt wurde getan / Verlust der HP wird eingeleitet

    (11- 10) / 1 = 1

    Phase 2: Nach Ergänzung bzw. Ausführung des Events / Erneuter Stillstand

    (11 - 11) / 1 = 0


    Und das ganze wird sich halt immer weiter so hoch ergänzen. Du kannst dir das ganze eingentlich relativ einfach verdeutlichen.

    Bau dir mehrere Texte ein die Variablen anzeigen.


    1. Vor der Aktivierung des Schalters für die Variable 16

    2. Eine direkt am Anfang des If-Befehls für die Variable 13

    3. Am Ende vom If-Befehl für die Variable 16


    Dann siehst du die Veränderung.


    -MrSerji