Hallo Leute,
die Ferien stehen vor der Tür, und damit ist es höchste Zeit alte Bugs zu entfernen die einem schon länger quälen.
Es geht um folgendes:
Ich habe einen Levelspeichermechanismus entwickelt, mit dem ich (theoretisch) abwärtskompatible Maps speichern kann.
D.h. wenn man sie später mit einer neueren Version des Spiels öffnet, liest er immer noch korrekt alle Positionen und/oder Variablen der einzelnen Objekte aus.
Ich habe das so gelöst, dass im Levelspeicherskript zuerst alle globalen Variablen, bzw. für das gesamte Level relevanten Variablen abgespeichert werden,
und dann bei den Objekten immer der object_index an erster Stelle steht, und danach alle lokalen Variablen, die zum Objekt dazugeladen werden sollen.
Das Ganze ist in mehreren do-until-Schleifen verpackt mit Wörtern wie "start" und "end" um die Schleifen einzugrenzen.
Ein gespeichertes Level (in diesem Fall nur mit 2 Objekten) sieht dann so aus:
Spoiler anzeigen
global_start //beginn der ersten schleife
filename
Maps/testlevel.spr
rmheight
10
rmwidth
1
global_end //ende der ersten schleife
blocks_start //beginn der zweiten schleife
199 //object_index des ersten objektes
start //beginn der dritten schleife, welche in der zweiten schleife ist
x
0
y
128
end //ende der dritten schleife, welche in der zweiten schleife ist
200 //object_index des zweiten objektes
start //beginn der dritten schleife (für das 2. objekt), welche in der zweiten schleife ist
x
128
y
128
end //ende der dritten schleife (vom zweiten objekt), welche in der zweiten schleife ist
blocks_end //ende der zweiten schleife
Mit dem Abspeichern der Levels funktioniert alles, nur beim Laden gibt es ein Problem:
___________________________________________
ERROR in
action number 2
of Draw Event
for object obj_controller_editor:
Error in function real().
Das Seltsame dabei ist nur, dass im besagten Event, sowohl kein Skript, als auch irgendein file_text-Befehl aufgerufen wird.
Wenn der GM etwas präzisere Error-Reports schreiben würde, würde das vieles erleichtern ...
Wenn ich jetzt auf "Ignore" klicke, dann hängt sich das Spiel auf,
also meine Vermutung ist, dass irgendwas mit den Schleifen nicht stimmt, oder mit der Konvertierung von Reals oder Strings.
Könnt ihr euch irgendeinen Reim darauf machen? Das Problem verhindert nun schon seit 3 Wochen ca. die Weiterentwicklung des Spiels,
weil sehr viel auf diesem Levelspeichermechanismus aufbaut ...
Ich wäre sehr sehr dankbar wenn sich jemand mit dem Problem ordentlich befassen würde.
Wer mir hier am besten weiterhilft bekommt einen Ehreneintrag in den Credits des Spiels! ;-)
Hier noch das Problemscriptchen:
Spoiler anzeigen
Alles anzeigen
die Ferien stehen vor der Tür, und damit ist es höchste Zeit alte Bugs zu entfernen die einem schon länger quälen.
Es geht um folgendes:
Ich habe einen Levelspeichermechanismus entwickelt, mit dem ich (theoretisch) abwärtskompatible Maps speichern kann.
D.h. wenn man sie später mit einer neueren Version des Spiels öffnet, liest er immer noch korrekt alle Positionen und/oder Variablen der einzelnen Objekte aus.
Ich habe das so gelöst, dass im Levelspeicherskript zuerst alle globalen Variablen, bzw. für das gesamte Level relevanten Variablen abgespeichert werden,
und dann bei den Objekten immer der object_index an erster Stelle steht, und danach alle lokalen Variablen, die zum Objekt dazugeladen werden sollen.
Das Ganze ist in mehreren do-until-Schleifen verpackt mit Wörtern wie "start" und "end" um die Schleifen einzugrenzen.
Ein gespeichertes Level (in diesem Fall nur mit 2 Objekten) sieht dann so aus:
global_start //beginn der ersten schleife
filename
Maps/testlevel.spr
rmheight
10
rmwidth
1
global_end //ende der ersten schleife
blocks_start //beginn der zweiten schleife
199 //object_index des ersten objektes
start //beginn der dritten schleife, welche in der zweiten schleife ist
x
0
y
128
end //ende der dritten schleife, welche in der zweiten schleife ist
200 //object_index des zweiten objektes
start //beginn der dritten schleife (für das 2. objekt), welche in der zweiten schleife ist
x
128
y
128
end //ende der dritten schleife (vom zweiten objekt), welche in der zweiten schleife ist
blocks_end //ende der zweiten schleife
Mit dem Abspeichern der Levels funktioniert alles, nur beim Laden gibt es ein Problem:
___________________________________________
ERROR in
action number 2
of Draw Event
for object obj_controller_editor:
Error in function real().
Das Seltsame dabei ist nur, dass im besagten Event, sowohl kein Skript, als auch irgendein file_text-Befehl aufgerufen wird.
Wenn der GM etwas präzisere Error-Reports schreiben würde, würde das vieles erleichtern ...
Wenn ich jetzt auf "Ignore" klicke, dann hängt sich das Spiel auf,
also meine Vermutung ist, dass irgendwas mit den Schleifen nicht stimmt, oder mit der Konvertierung von Reals oder Strings.
Könnt ihr euch irgendeinen Reim darauf machen? Das Problem verhindert nun schon seit 3 Wochen ca. die Weiterentwicklung des Spiels,
weil sehr viel auf diesem Levelspeichermechanismus aufbaut ...
Ich wäre sehr sehr dankbar wenn sich jemand mit dem Problem ordentlich befassen würde.
Wer mir hier am besten weiterhilft bekommt einen Ehreneintrag in den Credits des Spiels! ;-)
Hier noch das Problemscriptchen:
GML-Quellcode
- //lvl_load(filename)
- var file, currentobject;
- stringcheckhead = ""
- stringcheckheadreal = 0
- stringcheckcontent = ""
- //file name
- filename = argument0
- if (filename == "")
- exit;
- if (filename_ext(filename) != ".spr")
- filename += ".spr";
- if file_exists(filename)
- {
- //delete all objects
- instance_activate_all()
- file = file_text_open_read(filename)
- with (all)
- {
- if object_index != obj_controller and object_index != obj_contr_play and object_index != obj_contr_test_rm13 and object_index != obj_controller_editor and object_index != obj_controller_globvars and object_index != obj_contr_editorviewsnap
- instance_destroy()
- }
- //global
- //where is "global_start"
- do
- {
- stringcheckhead = file_text_read_string(file)
- file_text_readln(file)
- }
- until (stringcheckhead == "global_start")
- //global
- do
- {
- stringcheckhead = file_text_read_string(file)
- if stringcheckhead != "global_end"
- {
- file_text_readln(file)
- stringcheckcontent = file_text_read_string(file)
- if string_isdigits(stringcheckcontent) and not string_isletters(stringcheckcontent)
- variable_local_set(stringcheckhead,real(stringcheckcontent))
- else
- variable_local_set(stringcheckhead,stringcheckcontent)
- }
- file_text_readln(file)
- }
- until (stringcheckhead == "global_end");
- //where is "blocks_start"
- do
- {
- stringcheckhead = file_text_read_string(file)
- file_text_readln(file)
- }
- until (stringcheckhead == "blocks_start")
- //blocks
- do
- {
- if stringcheckhead != "start"
- {
- stringcheckhead = file_text_read_string(file) //object_index lesen
- stringcheckheadreal = real(stringcheckhead)
- currentobject = instance_create(0,0,stringcheckheadreal)
- file_text_readln(file)
- stringcheckhead = file_text_read_string(file) //"start" lesen
- file_text_readln(file)
- }
- if stringcheckhead == "start"
- {
- do
- {
- file_text_readln(file)
- stringcheckhead = file_text_read_string(file) //variablennamen lesen
- objektvariable = stringcheckhead
- if stringcheckhead != "end"
- {
- file_text_readln(file)
- stringcheckcontent = file_text_read_string(file)
- if string_isdigits(stringcheckcontent) and not string_isletters(stringcheckcontent)
- {
- with (currentobject)
- {
- variable_local_set(stringcheckhead,real(stringcheckcontent))
- }
- }
- else
- {
- with (currentobject)
- {
- variable_local_set(stringcheckhead,stringcheckcontent)
- }
- }
- }
- file_text_readln(file)
- }
- until (stringcheckhead == "end")
- }
- else
- {
- do //do until stringcheckhead = "start"
- {
- stringcheckhead = file_text_read_string(file) //"start" lesen
- file_text_readln(file)
- }
- until (stringcheckhead == "start")
- }
- }
- until (stringcheckhead == "blocks_end");
- //closing file at the end
- file_text_close(file)
- }
- //correcting room dimensions
- rmheight = rmheight*256
- rmwidth = rmwidth*1280
- if rmheight != room_height or rmwidth != room_width
- {
- BASS_ChannelStop(global.hstream)
- if room == editor_11 or room == editor_12
- lvl_save("Maps/temp.spr")
- if room == editor_11 //editorroom 1
- {
- room_set_height(editor_12,rmheight)
- room_set_width(editor_12,rmwidth)
- room_set_height(editortest_13,rmheight)
- room_set_width(editortest_13,rmwidth)
- room_goto(editor_12)
- }
- if room = editor_12 //editorroom 2
- {
- room_set_height(editor_11,rmheight)
- room_set_width(editor_11,rmwidth)
- room_set_height(editortest_13,rmheight)
- room_set_width(editortest_13,rmwidth)
- room_goto(editor_11)
- }
- //room 13 = testing room
- if room = playlevel_14 //playing room 1
- {
- room_set_height(playlevel_15,rmheight)
- room_set_width(playlevel_15,rmwidth)
- room_goto(playlevel_15)
- }
- if room = playlevel_15 //playing room 2
- {
- room_set_height(playlevel_14,rmheight)
- room_set_width(playlevel_14,rmwidth)
- room_goto(playlevel_14)
- }
- }