game_end() mit Voraussetzungen

  • GM 8

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • game_end() mit Voraussetzungen

    Guten Tag,

    Ich brauche kurz Hilfe bei einem (glaub ich) nicht zu schwierigem Problem.
    Ich mache ein Spiel, in dem man 32px schritte Läuft.
    Nachdem ich das Speichern und Laden mit eingebracht habe, bringt es ein Problem mit sich.

    Zu dem System: Der Player läuft in eine Richtung. Lässt der Spieler die richtungs taste los, läuft der Charakter immer
    die 32 Pixel zuende. Ich habe festgestellt, dass wenn man das Spiel während des laufens beendet, die Koordinaten
    x und y gespeichert werden, auch wenn er die 32px nicht zunende gelaufen ist.

    Richtige Koordinaten: 32; 64; 96; 128; ...
    Falsche Koordinaten: 43; 68; 97; ... [halt Zahlen die nicht in der 32er Reihe]

    Wie bekomme ich also hin, dass egal wie man das Spiel beendet, erst überprüft wird, ob die 32px zuende gelaufen
    sind, anschließend gespeichert und das Spiel dann erst beendet wird?
    Hier erstmal einige Codes die vielleicht dabei helfen.

    32px code im Step Event

    GML-Quellcode

    1. if bewegen=1
    2. {
    3. if weg=32
    4. {
    5. bewegen=0;
    6. speed=0;
    7. weg=0;
    8. blocken=0;
    9. if keyboard_lastkey == vk_left
    10. {
    11. sprite_index=sample_stand_left;
    12. }
    13. if keyboard_lastkey == vk_right
    14. {
    15. sprite_index=sample_stand_right;
    16. }
    17. if keyboard_lastkey == vk_up
    18. {
    19. sprite_index=sample_stand_up;
    20. }
    21. if keyboard_lastkey == vk_down
    22. {
    23. sprite_index=sample_stand_down;
    24. }
    25. }
    26. else
    27. {
    28. weg+=1;
    29. }
    30. }
    Alles anzeigen


    Speichern/Laden code im Game End Event

    GML-Quellcode

    1. var file;
    2. file = file_text_open_write("burhan.sav"); //öffnet Datei zum schreiben oder erstellt sie, falls sie nicht existiert
    3. file_text_write_string(file,string(x)); //schreibt in die erste Zeile den x-Wert des Objekts
    4. file_text_writeln(file) //springt in die nächste Zeile
    5. file_text_write_string(file,string(y)); //schreibt in die zweite Zeile den y-Wert des Objekts
    6. file_text_close(file); //schließt die Datei


    Danke schonmal für Antworten :)


    mfg
  • wie wärs wenn du die Koordinaten vor dem speichern auf 32 Pixel-Schritte rundest?

    GML-Quellcode

    1. x = floor(x/32)*32;
    2. y = floor(y/32)*32;


    Du dividierst die Koordinate durch 32, rundest sie ab und multiplizierst sie dann mit 32. > Damit richtest du jede Zahl nach einem beliebigen Raster aus. (Wenn es nach 16 Pixel sein soll, einfach die 32 gegen 16 ersetzen.)
    Statt floor kannst du natürlich auch die anderen Rundungsfunktionen benutzen. (je nachdem wie du es haben möchtest.)

    gruß

    LEWA

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von LEWA ()

  • Danke erstmal !
    Das hat mich schon etwas weiter gebracht.
    Zuerst hab ich das beim Speichern gemacht ... hat auch einige male funktioniert, aber
    manchmal sind die Koordinaten nicht mehr in der 32er Reihe :(
    Das selbe hab ich dann nochmal bei Laden versucht und es kommt das selbe raus.
    Ich weiß echt nicht woran es liegen könnte ... ich gehe mal davon aus, dass es auf die
    ganze Zahl rundet?
  • ich gehe mal davon aus, dass es auf die
    ganze Zahl rundet?


    Du wolltest es ja nach einem 32 Pixel Raster haben. > Daher rundet er immer auf ganze Zahlen. (Oder habe ich dein Problem falsch verstanden?)
    Eigentlich sollte das doch funktionieren. Ich verwende den Code selber für meine Spiele und da funktioniert die rasterung.

    Eine kleine Rechnung (als Beispiel) wie der code funktioniert: (mal in 16 Pixel Schritten)

    x ist 22:
    22/16 = 1,375 > abgerundet = 1 > Ergebniss * 16 (1*16) = 16.
    In dem Fall hat er aus der Koordinate 22 die Koordinate 16 gemacht.

    oder :
    x= 500
    500/16 = 31,25 (abgerundet 31) 31* 16 = 496.

    Wie du bemerkst sind die Ergebnisse alle perfekt durch 16 unterteilbar.
    Wenn du nun ein 32 Pixel Raster nehmen willst, tauscht du im code die 16 einfach gegen 32.


    Benutzt du dies wirklich VOR deinem Speichercode?
    Eventuell könntest du es auch so lösen:

    GML-Quellcode

    1. var file;
    2. file = file_text_open_write("burhan.sav"); //öffnet Datei zum schreiben oder erstellt sie, falls sie nicht existiert
    3. file_text_write_string(file,string(floor(x/32)*32)); //schreibt in die erste Zeile den x-Wert des Objekts
    4. file_text_writeln(file) //springt in die nächste Zeile
    5. file_text_write_string(file,string(floor(y/32)*32)); //schreibt in die zweite Zeile den y-Wert des Objekts
    6. file_text_close(file); //schließt die Datei

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von LEWA ()

  • Ja stimmt, das habe ich auch durchgerechnet. Deshalb hab ich mich gewundert wieso es nicht funktioniert.
    Ich glaube es liegt an meinem script um die 32px zu laufen, ich guck mir das nochmal an und
    schreib hier nochmal rein :)

    Edit: Lag wirklich daran.. Danke, hat funktioniert wie du es mir beschrieben hast [=
    Wie makier ich das Thema als gelöst?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Unistyle ()