Räume extern als Datei speichern und bei Bedarf laden

    • GM 8

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

    • Räume extern als Datei speichern und bei Bedarf laden

      Hallo,

      Ich habe bereits einige Themen dazu gefunden,aber keine hat mir wirklich geholfen.
      Deswegen möchte ich einmal genau erklären was ich benötige:

      Ich habe für mein Spiel einen Leveleditor gemacht,man kann das Level zwar spielen,aber nicht speichern.Ich möchte also ein Script oder irgendwie eine Möglichkeit haben,den aktuellen Raum(oder einen beliebig anderen),in eine Datei zu schreiben,die man selber vor dem speichern benennen kann(Beispiel: "level1").Dann soll man ebenfalls über den Leveleditor eine seiner eigenen erstellten Räume wieder laden können,indem man entweder indem man den Namen der Raum-Datei eingibt den Raum in den Level-Editor Raum lädt(oder einen anderen Raum),oder eine art durchsuch funktion,oder top-down-box(oder wie die heißt) dafür benutzen kann.

      Dies ist deshalb wichtig,weil die selbst erstellten Levels der Spieler Online hochgeladen werden können sollen,damit sie dort andere Spieler herunterladen können und im Leveleditor diese dann zu Laden und spielen zu können.
      Jeder Raum soll also in einer eigenen Datei gespeichert werden können!

      Zusammengefasst: Räume sollen als einzelne Dateien abgespeichert werden können und bei Bedarf wieder geladen werden können!

      Ich hoffe ihr konntet verstehen was ich meine und könnt mir weiterhelfen

      mfg Dominik
    • Danke für deine Hilfe,aber ich habe dieses Script bereits versucht zu verwenden und es hat nicht funktioniert.
      Wie gesagt habe ich dazu schon einige Themen gefunden,aber nichts hat geklappt

      PS:Wenn ich alle Scripte rein hab(3 Stück) und es so aufrufe:

      GML-Quellcode

      1. room_write_map("map")

      bekomme ich immer den Fehler: Data structure with index does not exist.

      Wenn ich es aufrufe mit:

      GML-Quellcode

      1. room_map_write("map")

      dann kennt er die variable room_map_write nicht

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

    • Benutz einfach Textdateien, die du mit der Funktion execute_file("mapdatei"); im eigentlichen Spiel wieder aufrufst. Das habe ich immer so gemacht.
      Sage deinen Objekten in deinem Level-Editor sie sollen beim Speichern der Map GML-Code in eine Datei schreiben.
      Beispiel:
      Du hast im Level-Editor 20 Wand-Objekte, oder Gegner oder was auch Immer.
      Beim Speichern der Karte könntest du für jedes Objekt den String "instance_create(x,y,objekt);" in die Mapdatei schreiben.

      GML-Quellcode

      1. //Beim Speichern der Karte
      2. map=file_text_open_write("map.txt"); //Öffnet die Datei map.txt (Existiert sie nicht, wird sie jetzt automatisch erstellt)
      3. with (objWall) //Für deine Wandobjekte
      4. {
      5. file_text_write_string(other.map,"instance_create("+string(x)+","+string(y)+",objWall);"); //Schreibt für jedes Wand-Objekt einen instance_create Aufruf in die Datei
      6. file_text_writeln(other.map); //Springt in die nächste Zeile (Machst du das nicht, werden alle instance_create Aufrufe in eine Zeile geschrieben, das sieht dann nicht schön aus ;)
      7. }
      8. file_text_close(map); //Erklärt sich ja von alleine^^

      Die Map-Datei kannst du in deinem Spiel einfach mit der Funktion "execute_file()" laden und er führt deinen generierten Code aus.

      PS: Nur so als Tipp, die Dateien können auch eine andere Endung als .txt haben. du kannst die Endungen selber bestimmen, solange sie Text enthalten, der aufgerufen werden kann.

      "Make love, not Warcraft"

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von HuRr!cAnE ()

    • er hatte versucht, die variable map in dem objekt zu finden, für welches du das instance_create schreiben wolltest. schau dir nochmal meinen code an und dann solltes es klappen. sorry mein fehler^^

      "Make love, not Warcraft"
    • Also es klappt schonmal,danke :)

      Wie muss ich es etz machen,wenn ich es mit jedem Object im Raum automatisch machen will?

      GML-Quellcode

      1. //Beim Speichern der Karte
      2. map=file_text_open_write("map.txt"); //Öffnet die Datei map.txt (Existiert sie nicht, wird sie jetzt automatisch erstellt)
      3. with (all) //Für deine Wandobjekte
      4. {
      5. file_text_write_string(other.map,"instance_create("+string(x)+","+string(y)+",id);"); //Schreibt für jedes Wand-Objekt einen instance_create Aufruf in die Datei
      6. file_text_writeln(other.map); //Springt in die nächste Zeile (Machst du das nicht, werden alle instance_create Aufrufe in eine Zeile geschrieben, das sieht dann nicht schön aus ;)
      7. }
      8. file_text_close(map); //Erklärt sich ja von alleine^^

      Hab mal das versucht,aber dann steht überall id drin,mit object_index gehts auch ned :(
    • Ja klar, du schreibst ja auch "id" rein und nicht den tatsächlichen Index als String.

      GML-Quellcode

      1. with (all)
      2. {
      3. file_text_write_string(other.map,"instance_create("+string(x)+","+string(y)+","+string(object_index)+")");
      4. file_text_writeln(other.map);
      5. }

      ...funktioniert wunderbar.
    • bekomme ich immer den Fehler: Data structure with index does not exist.
      Die Scripts erwarten eine ds_map als Argument ("map"). Am besten du probierst das mit dem Testprotokoll durch, ob auch alles funktioniert mit deine Game Maker-Version und deinem Spiel. Wenn du nun einen Raum speichern willst, musst du eine ds_map angeben (ds_map_create). Diese kannst du dann laut MewX später als Datei speichern (siehe Thread).

      Beispiel:

      GML-Quellcode

      1. //Speicher aktuellen Raum als Datei:
      2. global.RaumMap=ds_map_create();
      3. room_map_write(global.RaumMap);
      4. var f;
      5. f=file_text_open_write("map.txt");
      6. file_text_write_string(f,ds_map_write(global.RaumMap));
      7. file_text_close(f);
      wupto.net/ Nicht meine Seite!
      We love Koalas.

      GM-D-Spam-o-Meter: 32%
    • (Zu meinem Beispiel:)
      Du Solltest nicht with (all) verwenden. Benutze für jedes Objekt eine eigene with-Schleife.

      GML-Quellcode

      1. map=file_text_open_write("map.txt"); //Öffnet die Datei map.txt (Existiert sie nicht, wird sie jetzt automatisch erstellt)
      2. //Für alle Wand-Objekte
      3. with (obj_wand)
      4. {
      5. file_text_write_string(other.map,"instance_create("+string(x)+","+string(y)+",obj_wand);");
      6. file_text_writeln(other.map);
      7. }
      8. //Für alle Gegner
      9. with (obj_gegner)
      10. {
      11. file_text_write_string(other.map,"instance_create("+string(x)+","+string(y)+",obj_gegner);");
      12. file_text_writeln(other.map);
      13. }
      14. //Für alle Medipacks
      15. with (obj_medipack)
      16. {
      17. file_text_write_string(other.map,"instance_create("+string(x)+","+string(y)+",obj_medipack);");
      18. file_text_writeln(other.map);
      19. }
      20. //...und so weiter
      21. file_text_close(map);
      Alles anzeigen

      Die Objektnamen, die du in diesen instance_create-Aufrufen schreibst, sind die Namen der Objekte in deinem Hauptspiel. So weiß dein Spiel beim laden, welches Objekt er erstellen soll

      "Make love, not Warcraft"

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von HuRr!cAnE ()

    • Da gäbe es nur das Problem,dass es sehr viele Objecte,man könnte es natürlich machen(mit 50 Objecten...),aber das ist dann doch zu viel.
      Mit dem Code klappts nämlich super:

      GML-Quellcode

      1. //Beim Speichern der Karte
      2. map=file_text_open_write("map.txt");
      3. with (all)
      4. {
      5. file_text_write_string(other.map,"instance_create("+string(x)+","+string(y)+","+string(object_index)+")");
      6. file_text_writeln(other.map);
      7. }
      8. file_text_close(map);

      Jetzt wollte ich aber zusetzlich zu den Objecten auch noch den Background,die Room settings(höhe,breite) und eben alles was zu dem Raum gehört mit speichern.Wie mache ich das am besten?
      Spoiler anzeigen
      (Das ganze ist nämlich nicht für nen Leveleditor gedacht,sondern um bei Updates nur die Räume laden zu müssen und nicht das gesamte Spiel,deshalb müssen alle Daten des Raums in der externen Raum datei sein.Bei neuen Objecten muss man dann aber doch das Spiel nochmal laden,aber da das ja nicht oft der Fall sein wird,lohnt es sich so mehr)

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

    • Du lässt einfach alles, was du in deinem Hauptspiel schreiben würdest, von deinem Level-Editor in eine Datei schreiben.
      Beispiel:

      In deinem Hauptspiel würdest du folgendes schreiben:

      GML-Quellcode

      1. //Raumeinstelungen
      2. room_set_width(nameDesRooms,1024); //Setzt die Raumbreite auf 1024
      3. room_set_height(nameDesRooms,768); //Setzt die Raumhöhe auf 768
      4. background_visible[0]=true; //Macht den Background[0] sichtbar
      5. background_index[0]=nameDesBackgrounds; //Setzt den Background


      In deinem Level-Editor lässt du einfach beim Speichern der Map diesen Code als String eintragen:

      GML-Quellcode

      1. file_text_write_string(map,"room_set_width(nameDesRoomsImHauptspiel,"+string(room_width));
      2. file_text_writeln(map); //neue Zeile
      3. file_text_write_string(map,"room_set_height(nameDesRoomsImHauptspiel,"+string(room_height));
      4. file_text_writeln(map); //neue Zeile
      5. file_text_write_string(map,"background_visible[0]=true");
      6. file_text_writeln(map); //neue Zeile
      7. file_text_write_string(map,"background_index[0]=nameDesBackgroundsImHauptspiel");
      8. file_text_writeln(map); //neue Zeile

      "Make love, not Warcraft"