Seltsames jedoch interesantes Problem beim Laden eines ds_grid Level

  • GM 8

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

  • Seltsames jedoch interesantes Problem beim Laden eines ds_grid Level

    Ich arbeite an einer Template für das speichern und laden einer Map. Dazu habe ich mir Zwei Objekte hergezaubert:

    obControl
    obBlock

    Desweiteren habe ich ich 5 Skripte eingebracht ( ohne Argumente! ) die aufgeteilt sind:

    LvInit(); ds_grid erstellen
    LvGenerate(); generieren der map
    LvSave(); speichern der map
    LvLoad(); laden der map
    LvClear(); Löschen der map ( Nicht die Datei sondern jediglich der Raum! )

    Problem:
    Ich führe mein Programm aus, starte mit '1' das generieren der Map. Dann weiter zu Schritt Zwei dem Speichern und drück die
    Taste '2' dafür. Jetzt will ich die Map wieder laden mit Taste '3'. Gut es hat geklappt. Jetzt lösche ich sie mit LvClear();
    Nun Drück ich erneut die Generierungstaste und speicher die Map. Jetzt generiere ich nochzweimal bevor ich sie lade.
    Und wenn ich sie dann lade funktioniert es so als ob ich einen Schritt zurück generiert hätte. sozusagen das letzte generieren aufgehoben hätte.
    Dann mach ich das nochmal und bekomme die eigentlich gespeicherte Map wieder. Nun jetzt prüfte ich das mit öfterem generieren und das Resultat:
    Bei jedem laden der Map hob ich die letzte generierung auf und die darauf folgende durch erneutes laden der Map bis zum letzten Punkt wo ich gespeichert habe.
    Ich bin total verwirrt?! Habe ich einen unabsichtlichen Undo Befehl erzeugt?! XD

    obControl:
    Spoiler anzeigen

    Create:

    GML-Quellcode

    1. LvInit();

    Step:

    GML-Quellcode

    1. if keyboard_check_pressed(ord('1')) then LvGenerate();
    2. if keyboard_check_pressed(ord('2')) then LvSave();
    3. if keyboard_check_pressed(ord('3')) then LvLoad();
    4. if keyboard_check_pressed(ord('4')) then LvClear();



    Skripte:
    LvInit();
    Spoiler anzeigen

    GML-Quellcode

    1. Level = ds_grid_create(room_width,room_height); //<- Initalisieren der Map


    LvGenerate();
    Spoiler anzeigen

    GML-Quellcode

    1. //<- Generieren der Map
    2. for (Y=0;Y<room_height/16;Y+=1)
    3. {
    4. for (X=0;X<room_width/16;X+=1)
    5. {
    6. ds_grid_add(Level,X,Y,choose(1,0));
    7. if (ds_grid_get(Level,X,Y) == 1)
    8. {
    9. instance_create(X*16,Y*16,obBlock);
    10. }
    11. }
    12. }
    Alles anzeigen


    LvSave();
    Spoiler anzeigen

    GML-Quellcode

    1. Save = file_text_open_write("Map.sav"); //<- Speichern der Map
    2. for (Y=0; Y<room_height/16; Y+=1)
    3. {
    4. for (X=0; X<room_width/16; X+=1)
    5. {
    6. file_text_write_real(Save,ds_grid_get(Level,X,Y));
    7. file_text_writeln(Save);
    8. }
    9. }
    10. file_text_close(Save);
    Alles anzeigen


    LvLoad();
    Spoiler anzeigen

    GML-Quellcode

    1. Save = file_text_open_read("Map.sav"); //<- Laden der Map
    2. for (Y=0; Y<room_height/16; Y+=1)
    3. {
    4. for (X=0; X<room_width/16; X+=1)
    5. {
    6. ds_grid_set(Level,X,Y,file_text_read_real(Save));
    7. file_text_readln(Save);
    8. if ds_grid_get(Level,X,Y) == 0
    9. {
    10. with instance_position(X*16,Y*16,obBlock) { instance_destroy(); }
    11. }
    12. else if ds_grid_get(Level,X,Y) == 1
    13. {
    14. instance_create(X*16,Y*16,obBlock);
    15. }
    16. }
    17. }
    18. file_text_close(Save);
    Alles anzeigen


    LvClear();
    Spoiler anzeigen

    GML-Quellcode

    1. with obBlock { instance_destroy(); }; //<- Neue Map, alte Map leeren:


    Es ist kompliziert aber ich hoffe jemand kann mein Problem verstehen

    MFG: Mar96K
  • Hmm.. das ist in der tat ein merkwwürdiger Fehler.
    So konkret kann ich eigentlich nichts finden. Es wäre hilfreich wenn du einfach ein example posten würdest. Also als editierbare Datei.

    Des weiteren würde ich vorschlagen dass du in den LvGenerate(); Befehl einafch am Anfang einen LvClear(); Befehl hinzufügst.
    Dies sollte definitiv ausschließen dass der leetzte Stand noch irgendwo ist.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Noch als Anmerkung:

    ds_grid_add(grid, x, y, val) addiert val nämlich zu dem jetzigen Wert an der Position (x|y).
    Versuch's stattdessen mal mit ds_grid_set(grid, x, y, val).

    - Tobi97
  • Benutzer online 1

    1 Besucher