Leveleditor - Räume speichern und laden

  • Leveleditor - Räume speichern und laden

    Hallo liebe GameMaker-Community, ich habe mal wieder ein Problem... :S

    In meinem momentanen Projekt habe ich einen Leveleditor eingebaut, der es dem Spieler erlaubt, eigene kleine Stages zu erstellen. Da es eigentlich besser wäre, diese Levels speichern zu können, möchte ich ein Speicher- und Ladesystem erstellen. Ich dachte mir, dass der gesamte Raum als eine Datei im Spieleordner gespeichert wird, jedoch gibt es dazu ein Problem: Ich besitze nur die Lite-Version und kann also keine dll einbinden, da man meines Wissens nach die Funktion "Extension Packages" benutzen muss. Somit ist mein jetziger Code, den ich eigentlich benutzen wollte, so gut wie wertlos. Meine Frage ist nun:

    Gibt es eine Möglichkeit, einen Raum zu speichern und zu laden, ohne dass man die Pro-Version hat?

    Ich bedanke mich schon im Voraus für eure Hilfe!
  • Hi A.J.,

    ich habe für mein Spiel zwei Scripte geschrieben, mit denen ich Levels speichern kann:
    level_save
    Spoiler anzeigen

    GML-Quellcode

    1. // Argument0: Datei
    2. var xx, yy, file, write;
    3. file = argument0;
    4. write = file_text_open_write (file);
    5. for (yy = 0; yy < room_height; yy += 16) {
    6. for (xx = 0; xx < room_width; xx += 16) {
    7. var obj;
    8. obj = instance_position (xx, yy, all);
    9. if (obj != noone) {
    10. if (obj.object_index == obj_wall) {
    11. file_text_write_string (write, string (1));
    12. }
    13. else if (obj.object_index == obj_pod) {
    14. file_text_write_string (write, string (2));
    15. }
    16. else if (obj.object_index == obj_finish) {
    17. file_text_write_string (write, string (3));
    18. }
    19. else {
    20. file_text_write_string (write, string(0));
    21. }
    22. }
    23. else {
    24. file_text_write_string (write, string (0));
    25. }
    26. }
    27. file_text_writeln (write);
    28. }
    29. file_text_close (write);
    Alles anzeigen
    level_load
    Spoiler anzeigen

    GML-Quellcode

    1. // Argument0: Dateu
    2. var xx, yy, file, write;
    3. file = argument0;
    4. write = file_text_open_read (file);
    5. strpos = 0;
    6. str = "";
    7. for (yy = 0; yy < room_height; yy += 16) {
    8. var i;
    9. str = file_text_read_string (write);
    10. for (i = 1; i <= string_length (str); i += 1) {
    11. if (string_char_at (str, i) == "1") {
    12. instance_create ((i - 1) * 16 + 8, yy + 8, obj_wall);
    13. }
    14. else if (string_char_at (str, i) == "2") {
    15. instance_create ((i - 1) * 16 + 8, yy + 8, obj_pod);
    16. }
    17. else if (string_char_at (str, i) == "3") {
    18. instance_create ((i - 1) * 16 + 8, yy + 8, obj_finish);
    19. }
    20. }
    21. file_text_readln (write);
    22. }
    23. file_text_close (write);
    Alles anzeigen

    Hier ein Beispiel, wie du das Script anwenden kannst:

    GML-Quellcode

    1. level_load("level.lvl");
    Das Script musst du natürlich noch deinen Wünschen anpassen ;)

    MfG,
    -fabse64
  • Ich hab auch mal einen Editor erstellt.
    Meine Scripte kann man auch mit Leichtigkeit um mehrere Objekte erweiter. Bei Fabse müsste man ja immer mehr if abfragen benutzen.

    Speichern:
    Spoiler anzeigen

    GML-Quellcode

    1. global.file=get_save_filename("Barfiles|*.bar","")+".bar"
    2. {
    3. global.file=file_text_open_write(global.file)
    4. with(gegenstand)
    5. {
    6. file_text_write_string(global.file,string(object_index))
    7. file_text_writeln(global.file)
    8. file_text_write_string(global.file,string(x))
    9. file_text_writeln(global.file)
    10. file_text_write_string(global.file,string(y))
    11. file_text_writeln(global.file)
    12. }
    13. file_text_close(global.file)
    14. }
    Alles anzeigen



    Laden:
    Spoiler anzeigen

    GML-Quellcode

    1. var file,i,ix,iy;
    2. file=get_open_filename("Barfiles|*.bar","")
    3. if file_exists(file)
    4. {
    5. with(gegenstand) instance_destroy()
    6. file=file_text_open_read(file)
    7. while !file_text_eof(file)
    8. {
    9. i=file_text_read_string(file)
    10. file_text_readln(file)
    11. ix=file_text_read_string(file)
    12. file_text_readln(file)
    13. iy=file_text_read_string(file)
    14. file_text_readln(file)
    15. instance_create(real(ix),real(iy),real(i))
    16. }
    17. file_text_close(file)
    18. }
    Alles anzeigen



    Alle Objekte die man abspeichern kann müssen in diesem Fall als Parent Objekt "gegenstand" haben.
    Die Textdatei, die dabei rauskommt sieht dann zum Beispiel so aus:

    8
    512
    192

    (ein Objekt (object_index, x, y), jedes weitere Objekt wird einfach darunter angehängt.)
    Wäre natürlich sinnvoll diese Dateien dann zu verschlüsseln.

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

  • Naja tobiasre, wenn ich mich recht erinnere schreibt dein seltsames Critical Experiment in die Dateien den kompletten Code, also

    GML-Quellcode

    1. instance_create(bla)...

    und das frisst viel zu viel Speicher und ist meiner Meinung nach einfach nur unnötig.

    Im Gegenteil dazu gefallen mir die Skripts sehr, vorallem das von Superdaniel. Ich würde das allerdings noch auf eine Zeile kürzen, also soetwas:
    7|512|192

    und es dann mit copyboys "strings_get" Skript auslesen. Aber naja, ist nur eine Kleinigkeit die nicht gerade viel bringt. ;)
  • Er sagte auch lediglich einfacher, nicht "besser".

    Ich würde es auch mit Code machen, das lässt sich als *.txt leichter editieren, wenn mans nötig hat. Das Problem dabei ist eigentlich nur, dass es dadurch nicht geschützt ist (falls man das will).
    Ausserdem hätte ich wenig Lust, das komplexer zu machen, wenn es so schon geht.
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet
  • Das als Code zu speichern ist wirklich einfach nur reine Platzverschwendung und Unsinn, bedeutent einfacher ist es auch nicht. Außerdem gibt es dabei ein riesiges Problem: Man kann beliebig Code in euer Spiel einschleusen, wenn ihr das nicht ausreichend kontrolliert. Und das macht die Sache schon komplizierter... vorallem wenn ihr oben bereits fertige Skripte für die "andere" Methode habt.

    Aber: Als einfacher Text ist es auch nicht geschützt. Um die Dateien wirklich zu schützen braucht meine eine Dll die das kann. Zum Beispiel die Xor-Dll von Bl@cksp@rk... oder Ultracrypt. Eine Auswahl von DLLs findet ihr hier.

    Ich würde es auch mit Code machen, das lässt sich als *.txt leichter editieren, wenn mans nötig hat. Das Problem dabei ist eigentlich nur, dass es dadurch nicht geschützt ist (falls man das will).

    Quatsch. Als Text lässt es sich genauso leicht editieren. Das sind genau dieselben Argumente für die Funktion, nur platzsparender verpackt.
  • Benutzer online 1

    1 Besucher