Guten Tag,
Ich sitze schon ne ganze Weile daran in meinem Map Editor eine Undo (Rückgängig) Funktion einzubauen.
Normalerweise finde ich den Fehler nach so langer Zeit, aber ich bin schon alles tausendmal durchgegangen
und hoffe, dass ihr den Fehler findet [=
Die Undo Funktion sollte wie folgt gehen: Setzen und löschen von Objekten in eine 2 Dimensionale Array speichern.
Bei drücken von Strg+Z sollte der Vorgang rückgängig gemacht werden, sprich gesetzte Objekte werden gelöscht und
gelöschte Objekte (von Hand) wieder erstellt und die alte gelöschte id in der Array finden und mit der neuen ersetzen.
Naja das wars erstmal, eine Vorwärts Funktion überleg ich mir noch zu machen, da es wohl noch ein wenig komplizierter wird
Ich arbeite zum ersten mal richtig mit 2D Arrays, also wird der Code viell. nicht der beste sein^'^
Es gibt 2 Objekte: obj_place und obj_controller. Nun zum Code:
obj_controller:
Create-Event:
Ctrl-Event
Alles anzeigen
obj_place (Objekt welches erstellt wird wenn man etwas auf die map legt):
Create-Event:
Right-Released-Event (Hier wird ein Objekt auf der Map gelöscht):
Alles anzeigen
Zusatzinformation:
Also wenn man Objekte nur setzt funktioniert es einwandfrei diese mit Strg+Z wieder rückgängig zu machen.
Wenn ich aber z.B. 10 Stück setze, den 10. mit der Maus per Rechtsklick lösche passiert folgendes:
Objekt wird gelöscht. Nachdem Ich Strg+Z drücke wird das gelöschte Objekt wieder erstellt (wie es soll).
Nach noch einem mal Strg+Z wird das zuletzt erstellte Objekt wieder entfernt. (auch richtig)
Allerdings lassen sich die übrigen 9 Schritte nicht mehr rückgängig machen.
Mit einem show_message habe ich herausgefunden, dass die id in 19,0 nicht existiert.
Aber die müsste eigentlich durch das Create Event in obj_place vergeben sein : /
Es wäre echt nett wenn es sich jemand antut die Zusammenhänge zu verstehen und mir einen möglichen Fehlerfaktor
hinterlässt
mfg
Ich sitze schon ne ganze Weile daran in meinem Map Editor eine Undo (Rückgängig) Funktion einzubauen.
Normalerweise finde ich den Fehler nach so langer Zeit, aber ich bin schon alles tausendmal durchgegangen
und hoffe, dass ihr den Fehler findet [=
Die Undo Funktion sollte wie folgt gehen: Setzen und löschen von Objekten in eine 2 Dimensionale Array speichern.
Bei drücken von Strg+Z sollte der Vorgang rückgängig gemacht werden, sprich gesetzte Objekte werden gelöscht und
gelöschte Objekte (von Hand) wieder erstellt und die alte gelöschte id in der Array finden und mit der neuen ersetzen.
Naja das wars erstmal, eine Vorwärts Funktion überleg ich mir noch zu machen, da es wohl noch ein wenig komplizierter wird

Ich arbeite zum ersten mal richtig mit 2D Arrays, also wird der Code viell. nicht der beste sein^'^
Es gibt 2 Objekte: obj_place und obj_controller. Nun zum Code:
obj_controller:
Create-Event:
Ctrl-Event
GML-Quellcode
- //Undo Funktion/Vorgang
- if (keyboard_check_released(ord("Z"))) //Wenn Z losgelassen wird
- {
- if(global.undo[19,0]>0) //Überprüfung ob im letzten Vorgang (19) ein Objekt gesetzt wurde.
- {
- with(global.undo[19,0])
- {
- instance_destroy();
- for(i=19;i>0;i-=1)
- {
- for(a=0;a<10;a+=1)
- {
- global.undo[i,a]=global.undo[i-1,a]; //Liste wird so verschoben, dass der nächste Schritt in 18 in 19 verschoben wird, 17 in 18, 16 in 17 und so weiter
- }
- }
- }
- }
- else
- {
- if (global.undo[19,1]>0) //Wenn im letzten Schritt ein Objekt gelöscht wurde (von Hand)
- {
- //Ich habe nach dem instance_create 18 statt 19 geschrieben, weil ich nicht weiß ob das Create Event vom erstellten Objekt zuerst durchgeführt wird?
- object=instance_create(global.undo[19,2],global.undo[19,3],object_place); //Das Objekt wird wieder erstellt mit den vorher gespeicherten Objekt Informationen
- object.objectid=global.undo[18,5];
- object.object_depth=global.undo[18,6];
- object.z=global.undo[18,4];
- object.position=global.undo[18,7];
- object.image_speed=global.undo[18,8];
- object.image_id=global.undo[18,9];
- for(i=0;i<20;i+=1)
- {
- if (global.undo[i,0]==global.undo[18,1]) //Array nach einer nicht existierenden id suchen die in [18,1] gespeichert ist um sie mit der neuen zu ersetzen
- {
- global.undo[i,0]=object; //Neue ID
- }
- }
- for(i=18;i>0;i-=1)
- {
- for(a=0;a<10;a+=1)
- {
- global.undo[i,a]=global.undo[i-1,a]; //Neu Ordnung der Array
- }
- }
- }
- }
- }
obj_place (Objekt welches erstellt wird wenn man etwas auf die map legt):
Create-Event:
Right-Released-Event (Hier wird ein Objekt auf der Map gelöscht):
GML-Quellcode
- for(i=1;i<20;i+=1)
- {
- for(a=0;a<10;a+=1)
- {
- global.undo[i-1,a]=global.undo[i,a]; //Sortierung der Array, sodass der neue Vorgang in 19 gespeichert werden kann.
- }
- }
- //Informationen des gelöschten Objekts
- global.undo[19,0]=-1;
- global.undo[19,1]=id;
- global.undo[19,2]=x;
- global.undo[19,3]=y;
- global.undo[19,4]=z;
- global.undo[19,5]=objectid;
- global.undo[19,6]=object_depth;
- global.undo[19,7]=position;
- global.undo[19,8]=image_speed;
- global.undo[19,9]=image_id;
Zusatzinformation:
Also wenn man Objekte nur setzt funktioniert es einwandfrei diese mit Strg+Z wieder rückgängig zu machen.
Wenn ich aber z.B. 10 Stück setze, den 10. mit der Maus per Rechtsklick lösche passiert folgendes:
Objekt wird gelöscht. Nachdem Ich Strg+Z drücke wird das gelöschte Objekt wieder erstellt (wie es soll).
Nach noch einem mal Strg+Z wird das zuletzt erstellte Objekt wieder entfernt. (auch richtig)
Allerdings lassen sich die übrigen 9 Schritte nicht mehr rückgängig machen.
Mit einem show_message habe ich herausgefunden, dass die id in 19,0 nicht existiert.
Aber die müsste eigentlich durch das Create Event in obj_place vergeben sein : /
Es wäre echt nett wenn es sich jemand antut die Zusammenhänge zu verstehen und mir einen möglichen Fehlerfaktor
hinterlässt

mfg