JSON decode und ds maps iterieren

  • JSON decode und ds maps iterieren

    Ich hab mir eine JSON-Datei (siehe Anhang) erstellt, die ich als Highscoreliste verwenden möchte. Die Highscoreliste ist in 3 Schwierigkeitsgrade mit jeweils 10 Einträgen unterteilt, die wiederum Name und Zeit enthalten sollen.

    Jetzt habe ich Probleme beim auslesen der Datei. Aktuelle sieht die Abfrage so aus:

    GML-Quellcode

    1. if ( file_exists( global.highScoreFile ) ) {
    2. // Map key array
    3. map_key_array[0] = "easy";
    4. map_key_array[1] = "medium";
    5. map_key_array[2] = "hard";
    6. // read JSON string from file
    7. var readFile = file_text_open_read( global.highScoreFile );
    8. var fileString = file_text_read_string( readFile );
    9. // create ds_map from JSON string
    10. var readMap = json_decode( fileString );
    11. if ( readMap != -1 ) {
    12. // Erste Ebene durchlaufen "easy", "medium", "hard"
    13. for ( var d = 0; d < array_length_1d( map_key_array ); d++ ) {
    14. var mapArrayOne = ds_map_find_value( readMap, map_key_array[d] );
    15. var curr = ds_map_find_first( mapArrayOne );
    16. show_debug_message( "Level: " + string(map_key_array[d]) );
    17. show_debug_message( "Entries: " + string(ds_map_size( mapArrayOne )) );
    18. // Zweite Ebene durchlaufen 0,1,2...9
    19. for ( var p = 0; p < ds_map_size( mapArrayOne ); p++ ) {
    20. var listName = ds_map_find_value( curr, "name" );
    21. var listTime = ds_map_find_value( curr, "time" );
    22. // Wert ausgeben
    23. show_debug_message( string(p) + " : " + string(listName) + " = " + string(listTime) );
    24. // zum nächsten Wert
    25. curr = ds_map_find_next( mapArrayOne, curr );
    26. }
    27. }
    28. }
    29. ds_map_destroy( readMap );
    30. } else {
    31. show_debug_message('File ' + string( global.highScoreFile ) + ' not found!');
    32. }
    Alles anzeigen


    Als Ergebnis bekomme ich in der debug message folgendes ausgegeben.

    Level: easy
    Entries: 10
    0 : Unknown 1 = 1:0:0.00
    1 : Unknown 1 = 1:0:0.00
    2 : Unknown 1 = 1:0:0.00
    3 : Unknown 1 = 1:0:0.00
    4 : Unknown 1 = 1:0:0.00
    5 : Unknown 1 = 1:0:0.00
    6 : Unknown 1 = 1:0:0.00
    7 : Unknown 1 = 1:0:0.00
    8 : Unknown 1 = 1:0:0.00
    9 : Unknown 1 = 1:0:0.00
    Level: medium
    Entries: 10
    0 : Unknown 1 = 1:0:0.00
    1 : Unknown 1 = 1:0:0.00
    2 : Unknown 1 = 1:0:0.00
    3 : Unknown 1 = 1:0:0.00
    4 : Unknown 1 = 1:0:0.00
    5 : Unknown 1 = 1:0:0.00
    6 : Unknown 1 = 1:0:0.00
    7 : Unknown 1 = 1:0:0.00
    8 : Unknown 1 = 1:0:0.00
    9 : Unknown 1 = 1:0:0.00
    Level: hard
    Entries: 10
    0 : Unknown 1 = 1:0:0.00
    1 : Unknown 1 = 1:0:0.00
    2 : Unknown 1 = 1:0:0.00
    3 : Unknown 1 = 1:0:0.00
    4 : Unknown 1 = 1:0:0.00
    5 : Unknown 1 = 1:0:0.00
    6 : Unknown 1 = 1:0:0.00
    7 : Unknown 1 = 1:0:0.00
    8 : Unknown 1 = 1:0:0.00
    9 : Unknown 1 = 1:0:0.00


    Hier wird aber nicht wie erwartet der Name und die Zeit von jedem einzelnen Eintrag ausgegeben, sondern überall der Erste von "easy".
    Ich steig nicht dahinter, was ich falsch gemacht haben könnte.

    Normalerweise sollte doch mit

    GML-Quellcode

    1. curr = ds_map_find_next( mapArrayOne, curr );

    der nächste Eintrag angesprochen werden, oder nicht?
    Dateien
    • highscore.zip

      (275 Byte, 299 mal heruntergeladen, zuletzt: )
  • Ich bin grad mit handy online und habe mir die Funktion find_next noch nicht angeschaut, aber eine ds_map gibt sie nicht zurück.
    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
  • Also ich hab es jetzt damit hinbekommen.

    im Create Event:

    GML-Quellcode

    1. if ( file_exists( global.highScoreFile ) ) {
    2. // Map key array
    3. map_key_array[0] = "easy";
    4. map_key_array[1] = "medium";
    5. map_key_array[2] = "hard";
    6. // read JSON string from file
    7. var readFile = file_text_open_read( global.highScoreFile );
    8. var fileString = file_text_read_string( readFile );
    9. // create ds_map from JSON string
    10. var readMap = json_decode( fileString );
    11. if ( readMap != -1 ) {
    12. // Erste Ebene durchlaufen "easy", "medium", "hard"
    13. for ( var d = 0; d < array_length_1d( map_key_array ); d++ ) {
    14. var mapArrayOne = ds_map_find_value( readMap, map_key_array[d] );
    15. global.level[d] = string(map_key_array[d]);
    16. // Zweite Ebene durchlaufen 0,1,2...9
    17. for ( var p = 0; p < ds_map_size( mapArrayOne ); p++ ) {
    18. var curr = ds_map_find_value( mapArrayOne, string(p) );
    19. global.position[p, d] = string(p);
    20. global.listName[p, d] = ds_map_find_value( curr, "name" );
    21. global.listTime[p, d] = ds_map_find_value( curr, "time" );
    22. }
    23. }
    24. }
    25. ds_map_destroy( readMap );
    26. } else {
    27. show_debug_message('File ' + string( global.highScoreFile ) + ' not found!');
    28. }
    Alles anzeigen


    und Im Draw Event:

    GML-Quellcode

    1. for ( var i = 0; i < array_length_1d( global.level ); i++ ) {
    2. draw_text( ( ( room_width / 3 ) * i ) + ( room_width / 6 ), 160, global.level[i] );
    3. for ( var j = 0; j < array_height_2d( global.position ); j++ ) {
    4. draw_text( ( ( room_width / 3 ) * i ) + ( room_width / 6 ), 192 + (48 * j), global.listName[j, i]);
    5. draw_text( ( ( room_width / 3 ) * i ) + ( room_width / 6 ), 208 + (48 * j), global.listTime[j, i]);
    6. }
    7. }


    Jetzt bin ich mal gespannt, wie lange ich für das schreiben der aktualisierten Highscore brauche.