Eigenes Grid-Speichersystem arbeitet nicht so wie es soll

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

  • Eigenes Grid-Speichersystem arbeitet nicht so wie es soll

    Hallo, ich habe mein eigenes Grid-Speichersystem geschrieben, da ich aus bestimmten Gründen, auf die jetzt hier nicht einegehen will, nicht die vorhanden GMS Funktionen zum speichern eines Grids benutzen kann. Zum speichern hab ich folgenden Code geschrieben:

    GML-Quellcode

    1. var grid = "";
    2. for (i=0; i<room_width/32; i+=1)
    3. {
    4. for (j=0; j<room_height/32; j+=1)
    5. {
    6. if levelGrid[# i,j] < 10 {
    7. grid += "0" + string(levelGrid[# i,j])
    8. }
    9. else {
    10. grid += string(levelGrid[# i,j]);
    11. }
    12. }
    13. }
    Alles anzeigen


    Dieser String wird dann abgespeichert. Und zum laden mache ich dann dass:

    GML-Quellcode

    1. var count = 1;
    2. for (i=0; i<room_width/32; i+=1)
    3. {
    4. for (j=0; j<room_height/32; j+=1)
    5. {
    6. ds_grid_set(levelGrid, i,j, real(string_copy(grid, count,2)));
    7. count += 2;
    8. }
    9. }


    Variable "grid" enthält den geladenen String, den ich vorher abgespeichert hab. Eigentlich habe ich nur einen ewig langen Text der hauptsächlich aus den Ziffern "0" und anderen besteht. Ich habe vor immer pro Feld zwei Ziffern in den String geschrieben und lese ihn dann eigentlich wieder genau so aus. Aber das Ergebnis unterscheidet sich stark von dem gespeicherten Grid. Was ist mein Denkfehler?
  • levelGrid scheint bei dir eine ds-list zu sein.

    du versuchst aber auf sie wie ein array zuzugreifen.
    Auf die ds-list musst du per ds_list_find_value(levelGrid, pos) zugreifen oder einfach komplett ein array benutzen.
    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
  • Das ist ein Grid. Und man kann auch darauf wie mit einem Array zugreifen. Alles richtig. Ich Kenn mich nicht genau damit aus. Muss da kein "?" anstatt "#" hin?
    Warum muss das denn beim speichern eigentlich kleiner als 10 sein?

    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

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

  • Weil man in dem Grid auch Zahlen größer 10 abspeichern kann. Und ich muss ja wissen um wieviel Sellen ich den String Zelle für Zelle mit string_copy wieder auslese. Darum schreibe ich bei einstelligen Zahlen ne 0 davor, dann sind es immer genau zwei chars pr Zelle die ausgelesen werden.

    @ Larsi: Ich versteh dich nicht, denn ich benutz doch gar keine ds_list sondern einen Grid.
  • Wieso ist count beim lesen des Grid auf 1 gesetzt? Sollte das nicht auf 0 stehen?
    Edit:
    Evtl kannst du auch mal real(string_copy(grid, count, 1)) probieren.
    Da du eigentlich im Prinzip nur 1 Char weiter kopieren willst an der aktuellen Position count statt 2

    Eine bessere Methode (auch schneller und kompakter) wären Buffer

    GML-Quellcode

    1. // Buffer erstellen mit der Größe von GridWidth * GridHeight * 1 Byte
    2. // Mit dem type buffer_fixed weil die Größe immer gleich bleibt
    3. // und einem alignment von 1 Byte weil wir jeweils mit einem 1 Byte schreiben (glaub jedenfalls das das Alignment so funktioniert)
    4. var bufferGrid = buffer_create(gridWidth * gridHeight * 1, buffer_fixed, 1);
    5. // Iterieren durch das Grid und jeweils für jedes Feld im Grid 1 Byte schreiben (eine zahl von 0-255, sollte reichen um deine Tiles zu identifizieren)
    6. for (var i = 0; i < gridWidth; i++)
    7. {
    8. for (var j = 0; j < gridHeight; j++)
    9. {
    10. buffer_write(buffer, buffer_u8, grid[# i, j]);
    11. }
    12. }
    13. // Den Buffer in einer File speichern und löschen
    14. buffer_save(buffer, "Ayylmao.dat");
    15. buffer_delete(buffer);
    Alles anzeigen

    Das laden überlasse ich jedoch dir ;)
    :saint:

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Tice ()

  • Stimmt. Mit Buffern wäre es da leichter und weniger Speicher.
    @Tice
    Er hat count auf 1 gesetzt, weil Studio bei 1 anfängt.

    Edit:
    Nur hier muss man die Datei abspeichern. Das ist ja auch nicht Sinn der Sache, wenn das in ein String rein sollte....
    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