Suche nach Tutorial für Highscore (mit Lösung)

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

  • Suche nach Tutorial für Highscore (mit Lösung)

    Hallo zusammen,

    ich möchte in meinem Spiel germ eine funktionierende Highscore Liste integrieren. Die Highscore Liste soll nur auf dem Gerät lokal gespeichert werden und nicht global.

    Leider habe ich bisher kein für mich brauchbares Tutorial gefunden. Bevorzugt wäre natürlich ein deutsches, englisch ist aber auch kein Problem.

    Vielen Dank für eure Hilfe :)
    Where words fail. hate speaks!

    Mein erstes, abgeschlossenes Projekt: [Android] Crappy Plane
  • Was heißt lokal? Sozusagen als Savedatei, wo die ganzen Daten drin gespeichert sind? Gerät heißt in dem Fall was genau, sprich welche Plattform? Windows, Android... Wäre vielleicht ganz gut, wenn du das Ganze nochmal etwas näher umschreiben könntest.
  • Entschuldigt für die späte Antwort.

    Die Highscore Liste soll lokal bei jedem Nutzer gespeichert werden, natürlich möglichst so, dass Sie nicht manipuliert werden kann.

    Mit Geräte sind Windows PCs und Android Geräte gemeint.

    Im Endeffekt soll es so ausehen:

    Der Spieler erspielt eine Punktzahl. Wenn diese höher als die bisherigen der maximal 10 Einträge ist, soll er seinen Namen eingeben und sich somit in die Liste eintragen lassen. Zudem muss die Liste auch über einen Button im Menü abrufbar sein.
    Where words fail. hate speaks!

    Mein erstes, abgeschlossenes Projekt: [Android] Crappy Plane
  • Du hast zwei Möglichkeiten:

    entweder nimmst du die in gms integrierte Highscoreliste (docs.yoyogames.com/source/dadiospice/002_reference/social gaming/achievements and leaderboards/local high scores/index.html), (und hier steht wie Du sie einbindest: gamemaker-tutorials.com/high-s…table-in-gamemaker-studio).

    Oder Du nutzt ein auf einer ini.Datei basierende Highsore-Liste, die dann gespeichert wird und veränderbar wäre unter gewissen umständen.

    ...
    Dieser Beitrag wurde ausgezeichnet mit einem großen LOB.
  • Das von dir benannte Tutorial habe ich während meiner langen Suche bereits ebenfalls gefunden, verstehe es nur leider nicht. Habe auch schon auf Youtube nach geeigneten Tutorials gesucht, bin dort aber auch nicht wirklich fündig geworden.
    Where words fail. hate speaks!

    Mein erstes, abgeschlossenes Projekt: [Android] Crappy Plane

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von hAtE NeVeR dIeS ()

  • Was gibt es an dem Tutorial nicht zu verstehen?

    Du erstellst ein Objekt: obj_highscore oder wie auch immer

    Im CREATE-EVENT kommt

    Quellcode

    1. highscore_add(global.name, score); //global.name kannst Du mit keyboard_string zum Beispiel hinbekommen


    Im STEP-EVENT kommt die Schleife um die Tabelle zu generieren:

    Quellcode

    1. var i;
    2. i = 10;
    3. repeat(10)
    4. {
    5. name[i] = highscore_name(i);
    6. scr[i] = highscore_value(i);
    7. i -= 1;
    8. }


    und im DRAW-EVENT zeichnest Du Die Highscore Tablelle ;)

    Quellcode

    1. draw_set_font(fnt_game);
    2. draw_set_colour(c_white);
    3. draw_highscore( 200, 32 , room_width - 200, room_height - 200 );


    Und aufrufen tust Du das Objekt, wenn live == 0 oder wie auch immer oder wo auch immer
    Dieser Beitrag wurde ausgezeichnet mit einem großen LOB.
  • Irgendwie passen deine Codes nicht ganz zusammen Pestamoebe...

    Zum Problem:
    Das Wichtigste ist im draw event von irgendeinem Objekt, welches den Highscore anzeigen soll:

    GML-Quellcode

    1. draw_highscore( x1, y1 ,x2 ,y2);

    und dann wo man ein Highscore eintragen kann (ich glaub da, wo der Spieler scheitert oder eben gewinnt)

    GML-Quellcode

    1. highscore_add(get_string("Bitte gebe einen Namen für die Highscore-Liste an"), score);

    Kopiere dies in deine Signatur, um es in deiner Signatur zu haben.
    Achtung: Dieser Beitrag läuft ende des Monats ab, bitte lese ihn noch vor dem Monatswechsel...
    Nach langer zeit wieder im Forum aktiv :D
  • Vielen lieben Dank, der Post von Larsi hat Licht ins dunkle gebracht.

    Jetzt habe ich nur noch das Problem, dass er die Highscores nach einem Neustart des Programms nicht speichert. Dies betrifft in diesem Fall Android, auf Windows funktioniert es. Kann mir da noch wer behilflich sein?
    Where words fail. hate speaks!

    Mein erstes, abgeschlossenes Projekt: [Android] Crappy Plane

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von hAtE NeVeR dIeS ()

  • in den android settings, kannst du write_external_storage an mache, dann müsste es gehe. ;)
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Es erschien mir nur logisch, hat aber leider auch nich geklappt. Ich habe die Highscore im Moment wie folgt umgesetzt:

    Im Button zum Starten des Spiels habe ich folgenden Code hinterlegt:

    GML-Quellcode

    1. global.yourname = get_string("Enter your name please","anonym");


    Im Step Event der Spilfigur habe ich bei Berührung mit Hindernissen folgenden Code verwendet:

    GML-Quellcode

    1. highscore_add(global.yourname, score);


    Im Draw Event der Highscore Liste habe ich folgenden Code verwendet:

    GML-Quellcode

    1. draw_set_color(c_black);
    2. draw_set_font(fnt_score);
    3. draw_text(30,5,"Score "+string(score))


    Kann jemand einen Fehler finden oder was kann ich ändern, damit es auf Android funktioniert? Das Spiel soll am Ende nur auf Android erscheinen, weshalb Windows als Plattform zu vernachlässigen ist.
    Where words fail. hate speaks!

    Mein erstes, abgeschlossenes Projekt: [Android] Crappy Plane
  • Eventuell statt get_string get_string_async() verwenden, hab keine Erfahrung mit Android, deswegen ist das mehr ein Schlag ins Dunkle. Noch nen paar Fragen: Sind das alle Codes in den jeweiligen Events oder hast du was unterschlagen, was du vielleicht für unwichtig hieltest? Klappen alle andere Dinge wie gewünscht?
    Edit: Quelle
  • Leider hat dein Tipp auch nichts gebracht, er bezieht sich allerdings auch nur auf die Eingabe des Namens. Das habe ich ja wie im vorherigen Post angegeben realisiert und funktioniert tadellos.

    Natürlich haben die jeweiligen Objekte noch weitere Anweisungen, welcher meiner Meinung nach aber nicht mit der Highscoreliste an sich in Verbindung stehen, außer das Event, welches die Punktzahl erhöhen lässt:

    GML-Quellcode

    1. score += 1
    Where words fail. hate speaks!

    Mein erstes, abgeschlossenes Projekt: [Android] Crappy Plane
  • So ich habe das ganze nun unter Verwendung von INI Dateien umgesetzt. Anbei stelle ich anderen Usern, welche das gleiche Problem haben die Lösung zur Verfügung.

    Abfrage des Spielernamens und speichern in einer globalen Variable, damit der Name des Spielers das gesamte Spiel über gespeichert bleibt:

    GML-Quellcode

    1. global.yourname = get_string("Enter your name please","anonym");


    Zum Speichern des Highscores folgenden Code verwenden:

    GML-Quellcode

    1. highscore_add(global.yourname, score);
    2. global.score1=highscore_value(1);
    3. global.score2=highscore_value(2);
    4. global.score3=highscore_value(3);
    5. global.score4=highscore_value(4);
    6. global.score5=highscore_value(5);
    7. global.score6=highscore_value(6);
    8. global.score7=highscore_value(7);
    9. global.score8=highscore_value(8);
    10. global.score9=highscore_value(9);
    11. global.score10=highscore_value(10);
    12. global.name1=highscore_name(1);
    13. global.name2=highscore_name(2);
    14. global.name3=highscore_name(3);
    15. global.name4=highscore_name(4);
    16. global.name5=highscore_name(5);
    17. global.name6=highscore_name(6);
    18. global.name7=highscore_name(7);
    19. global.name8=highscore_name(8);
    20. global.name9=highscore_name(9);
    21. global.name10=highscore_name(10);
    22. ini_open("data.ini")
    23. ini_write_real("scores","score1",global.score1);
    24. ini_write_real("scores","score2",global.score2);
    25. ini_write_real("scores","score3",global.score3);
    26. ini_write_real("scores","score4",global.score4);
    27. ini_write_real("scores","score5",global.score5);
    28. ini_write_real("scores","score6",global.score6);
    29. ini_write_real("scores","score7",global.score7);
    30. ini_write_real("scores","score8",global.score8);
    31. ini_write_real("scores","score9",global.score9);
    32. ini_write_real("scores","score10",global.score10);
    33. ini_write_string("names","name1",global.name1);
    34. ini_write_string("names","name2",global.name2);
    35. ini_write_string("names","name3",global.name3);
    36. ini_write_string("names","name4",global.name4);
    37. ini_write_string("names","name5",global.name5);
    38. ini_write_string("names","name6",global.name6);
    39. ini_write_string("names","name7",global.name7);
    40. ini_write_string("names","name8",global.name8);
    41. ini_write_string("names","name9",global.name9);
    42. ini_write_string("names","name10",global.name10);
    43. ini_close()
    44. score = 0;
    Alles anzeigen


    Dieser Code ist zum Aufrufen des Scores da, er sollte noch vor dem eigentlichen Spielstart geladen werden, damit die Highscore durch den Code oben mit neue Daten befüllt wird. Wenn dieser Code nicht vor dem Spielstart geladen wird, werden die bisherigen Highscores überschrieben! Man kann diesen Code auch dazu verwenden, wenn man die Highscores in einem separaten Raum aufrufen möchte, beispielsweise damit der User diese jederzeit einsehen kann um zu prüfen, welchen Platz er hat.

    GML-Quellcode

    1. global.score1=highscore_value(1);
    2. global.score2=highscore_value(2);
    3. global.score3=highscore_value(3);
    4. global.score4=highscore_value(4);
    5. global.score5=highscore_value(5);
    6. global.score6=highscore_value(6);
    7. global.score7=highscore_value(7);
    8. global.score8=highscore_value(8);
    9. global.score9=highscore_value(9);
    10. global.score10=highscore_value(10);
    11. global.name1=highscore_name(1);
    12. global.name2=highscore_name(2);
    13. global.name3=highscore_name(3);
    14. global.name4=highscore_name(4);
    15. global.name5=highscore_name(5);
    16. global.name6=highscore_name(6);
    17. global.name7=highscore_name(7);
    18. global.name8=highscore_name(8);
    19. global.name9=highscore_name(9);
    20. global.name10=highscore_name(10);
    21. ini_open("data.ini")
    22. global.score1=ini_read_real("scores","score1",0);
    23. global.score2=ini_read_real("scores","score2",0);
    24. global.score3=ini_read_real("scores","score3",0);
    25. global.score4=ini_read_real("scores","score4",0);
    26. global.score5=ini_read_real("scores","score5",0);
    27. global.score6=ini_read_real("scores","score6",0);
    28. global.score7=ini_read_real("scores","score7",0);
    29. global.score8=ini_read_real("scores","score8",0);
    30. global.score9=ini_read_real("scores","score9",0);
    31. global.score10=ini_read_real("scores","score10",0);
    32. global.name1=ini_read_string("names","name1","Empty");
    33. global.name2=ini_read_string("names","name2","Empty");
    34. global.name3=ini_read_string("names","name3","Empty");
    35. global.name4=ini_read_string("names","name4","Empty");
    36. global.name5=ini_read_string("names","name5","Empty");
    37. global.name6=ini_read_string("names","name6","Empty");
    38. global.name7=ini_read_string("names","name7","Empty");
    39. global.name8=ini_read_string("names","name8","Empty");
    40. global.name9=ini_read_string("names","name9","Empty");
    41. global.name10=ini_read_string("names","name10","Empty");
    42. ini_close()
    43. highscore_clear()
    44. highscore_add(global.name1,global.score1);
    45. highscore_add(global.name2,global.score2);
    46. highscore_add(global.name3,global.score3);
    47. highscore_add(global.name4,global.score4);
    48. highscore_add(global.name5,global.score5);
    49. highscore_add(global.name6,global.score6);
    50. highscore_add(global.name7,global.score7);
    51. highscore_add(global.name8,global.score8);
    52. highscore_add(global.name9,global.score9);
    53. highscore_add(global.name10,global.score10);
    Alles anzeigen



    Die Anzeige der Highscore Liste habe ich mit folgendem Code realisiert:

    GML-Quellcode

    1. draw_set_color(c_black);
    2. draw_set_font(fnt_score);
    3. draw_highscore(100, 100, room_width - 100, room_height - 100);


    Sollte jemand Fragen zum Highscore System haben, kann er mir gern eine PN senden. Ich werde dann schnellstmöglich versuchen, diese zu beantworten.

    Ich bedanke mich noch einmal bei allen, die an der Lösung beteiligt waren! :thumbsup:

    P.S.: Diese Lösung kann so unter Windows und Android genutzt werden. Mit hoher Wahrscheinlichkeit auch unter so ziemlich jeder anderen Plattform. Es braucht zudem auch keine Berechtigungen wie write_external_storage benötigt.
    Where words fail. hate speaks!

    Mein erstes, abgeschlossenes Projekt: [Android] Crappy Plane

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von hAtE NeVeR dIeS ()

  • Schön, dass du das Thema abschließen konntest, Speichersysteme sind ja auch nicht das Aufregendste der Welt. Dein Code funktioniert ja, da will jetzt auch gar nicht rein pfuschen, aber die Übersichtlichkeit leidet natürlich, deshalb würde es sich lohnen mit den eingebauten Datenstrukturen (Listen, Arrays, Grids) zu beschäftigen, da man dann diese 60 Zeilen Code auf maximal 10 runterbrechen könnte. Wäre einfach ein gut gemeinter Tipp für die Zukunft, aber stolpert früher oder später sowieso über Datenstrukturen, daher keine Sorge.
  • Hehe das dies nicht die eleganteste Lösung ist, ist mir bewusst. Da ich mich aber noch am Anfang meiner Karriere befinde, reicht mit dies für den Moment so aus, da mein Ziel erreicht ist. Ich bin optimistisch, dass ich diesen Code vereinfachen kann, sobald ich weiter in GML vorgestoßen bin.

    Atomicmaster schrieb:

    Hoffe dem TE konnte damit geholfen werden.


    Da ich selbst der Ersteller des Themas bin, kann ich dies bestätigen :D Ich stelle soetwas immer gern anderen zur Verfügung, vor allem weil ich 2 Wochen an der Lösung gesucht und gearbeitet habe (aber natürlich nicht durchweg).
    Where words fail. hate speaks!

    Mein erstes, abgeschlossenes Projekt: [Android] Crappy Plane

  • Da ich selbst der Ersteller des Themas bin, kann ich dies bestätigen
    Ich stelle soetwas immer gern anderen zur Verfügung, vor allem weil ich
    2 Wochen an der Lösung gesucht und gearbeitet habe (aber natürlich
    nicht durchweg).


    Huch nicht drauf geachtet xD Praktisch wenn die Fragen steller ihre fragen selbst beantworten ;)