Ich habe letztens irgendwo gelesen, dass Loops im Gegensatz zu Label-Schleifen fehleranfällig sind.Kann jemand etwas genaueres dazu sagen?
Der einzige Unterschied der mir aufgefallen ist, ist dass Loops langsamer sind.
Ich würde gerne wegen der deutlich besseren Übersicht die Loops benutzen, da mir gerade bei aufwändigeren Sachen Übersicht wichtig ist.
Sollte es nämlich nur die Sache mit den Wiederholungen sein, kann ich darauf verzichten und habe dafür lieber mehr Übersicht.
Afair/afaik:
Der Breakloop-Befehl springt zum nächsten Loop-Ende. Das muss nicht das Loop-Ende sein, dass du damit zu erreichen meinst. Dadurch könntest du Code erhalten, der sich völlig anders verhält als du es erwartest.
Tipp: Nimm den 2k9 Ultimate, da gibts gute Färbung der Befehlszeilen und ein größeres Codefenster damit kannst du es dir selbst übersichtlicher machen. Ansonsten Kommentare. ich setze gerne <BEGIN FOREACH MONSTER > </END FOREACH MONSTER> oder sowas um meine Schleifen.
Oder war es so, dass Break ans Ende der äußersten Schleife springt?
...
Irgendwo hat das schonmal jemand gesagt. Kann selber nichts rekonstruieren. Edit:
Ich glaube, es ging darum, dass die Schleife, in welcher der Break-Befehl auftrat eben nicht beendet werden konnte, weil stromabwärts des Breaks eine untergeordnete Schleife auftrat ...was rede ich da, der RM2k(3) kümmert sich nicht um Hierarchien.
Der StopLoop / BreakCycle Befehl merkt sich das nächste auftretende Ende einer Schleife als neuen Script-Entry vor ( [...+18] ). Wenn man den Befehl vor eine Schleife packt, wird diese beim ersten Ausführen übersprungen.
Edit:
@Cherry:
489AA5 | mov eax,[eax+8]//get found LoopCommand's data
489AA8 | cmp eax,[edi+8]//Is this <>Loop the one that triggered sub_489A78?
489AAB <<jnz loc_489AB3 //jump if not
Ganz recht, ich wollte da eh mal einen Bugfix machen - man braucht ja nur überprüfen ob die TreeDepth (scriptline+8 afair) des Endloop-Befehls dieselbe wie die des aktuellen ist.
--
Mir war nichtmal bewusst dass ich nominiert wurde, aber: Cool! Hälfte des Lobes muss aber unbedingt an Archeia!
Ich halte es ja sowieso für ratsam, immer am Ende einer Schleife den Break zu setzen.
Oder zumindest an einem Punkt, wo möglicherweise vorhandene Unterschleifen schon abgearbeitet sind.
--
Solange es hier falschzitierende Ärsche gibt, dulde ich keinerlei Zitatboxen, die von mir sein sollen.
Hierarchie-sensitive BreakCycle / BreakLoop Befehle. (wenn man diese außerhalb jeglicher Loops ausführt, dann springt das Skript an das Ende des Events)
Also hat das nur Probleme mit verschachtelten Loops?
Das heißt ich müsste also nur aufpassen, wo ich denn jetzt meine Break Loop-Befehle hinpacke und dann ist alles gut oder?
Ich hab mal den Patch von bugmenot ausprobiert:
Zitat von EasyEventExporter
- SCRIPT -
<> Change Variable: [1] = 0
<> Change Variable: [2] = 0
<> Loop
. <> Change Variable: [1] += 1
. <> Change Variable: [3] = V[2]
. <> Change Variable: [3] *= 2
. <> Show Message: test:
. : \v[1]
. : \v[2]
. <> Fork Condition: If Variable [1] >= 10 then ...
. . <> Show Message: lbreak1
. . <> Break Loop
. . <>
. : End of fork
. <> Loop
. . <> Change Variable: [2] += 1
. . <> Fork Condition: If Variable [2] >= V[3] then ...
. . . <> Show Message: lbreak2
. . . <> Break Loop
. . . <>
. . : End of fork
. . <>
. : End of loop
. <>
: End of loop
<> Show Message: test fertig
...
Ohne seinen Patch, läuft das ganze immer weiter, auch wenn Variable 1 größer als 10 ist. Die zweite Schleife wird dabei übersprungen.
Mit seinem Patch, springt das ganze nach dem ersten "lbreak2" scheinbar ganz an den Eventanfang, da mir die erste Nachricht dann die Werte 1 und 0 ausgibt. Das ganze bricht also früher ab als es soll und die Nachricht "test fertig" wird gar nicht erst ausgegeben.
@Corti: Ich benutze den 2k9 Ultimate und kommentiere auch, aber finde es trotzdem schöner wenn ich den Loop-Block anklicke und sofort alles markiert wird, was auch zur Schleife gehört.
@MagicMaker: Genau so würde ich es dann einfach machen, auch wenn man dann eventuell ein bisschen gucken muss, dass eine Unterschleife nicht 1x zu oft abgearbeitet wird. Allerdings sollte das kein großes Problem sein.
Korrektur: Ich meinte, die TreeDepth muss natürlich kleiner als die aktuelle sein. Nicht gleich (und auch nicht einfach nur um eins kleiner oder so). Ich hatte vergessen dass man ja wahrscheinlich noch andere Treestrukturen braucht.
EDIT: Damn, ich muss wir was anderes überlegen. Weil:
0...<> Loop
1......<> Fork If ...
2.........<> Break Loop
2.........<>
1......: End Case
1......<> Loop
2.........<>
1......: End Loop
1......<> Message "Hello"
0...: End Loop
Dieses Beispiel würde dann nämlich trotzdem "Hello" ewig ausgeben, anstatt nichts.
Man müsste alle Zeilen durchgehen, einen Counter für jedes Loop um 1 erhöhen und für jedes End Loop um 1 verringern. Und wenn der Counter (angenommen er startet mit 0) kleiner 0 ist, DANN haben wir das richtige End Loop gefunden.
--
Mir war nichtmal bewusst dass ich nominiert wurde, aber: Cool! Hälfte des Lobes muss aber unbedingt an Archeia!
4B0C50 <>StopLoop[+]
4B0C50 push ebx
4B0C51 mov ebx,edx //memorize Ptr on EventScriptData(?)
4B0C53 mov edi,[edx+18] //memorize Line# of the used BreakLoop
__________CheckForLoopEnd__________
4B0C56 ->mov edx,[ebx+18]/get the current line in the script
4B0C59 | mov eax,[ebx+14]/get Ptr on listed EventCommands
4B0C5C | c.sub_479710 //get ScriptLine
4B0C61 | mov ecx,eax //get Ptr on ScriptLineData
4B0C63 | mov eax,[ecx+4]//get ScriptLine's Command_ID
4B0C66 | test eax,eax //Was the end of the script reached already?
4B0C68 < jz loc_4B0C84 //jump if it was
4B0C6A | cmp eax,56C2 //Is the ScriptLine = : EndLoop?
4B0C6F <<jnz loc_4B0C86 //jump if not
4B0C71 | mov edx,[ecx+08]/get TreeDepth of the : EndLoop
4B0C74 | mov ecx,ebx //get Ptr on EventScriptData(?)
4B0C76 | mov eax,edi //get Line# of the used BreakLoop
4B0C78 | c.sub_4963F1 //call CheckLoopEnd[+]
| 4963F1 <>CheckLoopEnd[+]
| 4963F1 push ebx
| 4963F2 push edi
| 4963F3 push esi
| 4963F4 push ebp
| 4963F5 mov ebp,[ecx+14] //get Ptr on listed EventCommands
| 4963F8 mov ebx,eax //get Line# of the used BreakLoop
| 4963FA mov edi,edx //memorize TreeDepth of the : EndLoop
| 4963FC xor esi,esi //initialize Counter
|__________GetLoopStart__________
| 4963FE ->dec ebx //previous line
| 4963FF | cmp ebx,0 //was the start of the script reached?
| 496402 < jl loc_49642A //jump on invalid ScriptLine
| 496404 | mov edx,ebx //get current line
| 496406 | mov eax,ebp //get Ptr on listed EventCommands
| 496408 | c.sub_479710 //get ScriptLine
| 49640D | cmp //Is this line = <>Loop?
| 496414 < jnz loc_496419 //jump if not
| 496416 | dec esi //Counter -1
| 496417 <<jmp loc_496423
| 496419 > cmp //Is this line = : EndLoop?
| 496420 <<jnz loc_496423 //jump if not
| 496422 | inc esi //Counter +1
| 496423 >>cmp esi,0 //Is this a lone <>Loop?
| 496426 --jge //jump if not
|________________________________
| 496428 jmp loc_496431
| 49642A xor eax,eax //output = WrongEndLoop
| 49642C pop ebp
| 49642D pop esi
| 49642E pop edi
| 49642F pop ebx
| 496430 ret
| 496431 cmp edi,[eax+8] //Are the <>Loop and the : EndLoop at the same Depth?
| 496434 jnz loc_49642A //jump if not
| 496436 xor eax,eax
| 496438 inc eax //output = RightEndLoop
| 496439 jmp loc_49642C //ret
4B0C7D | test eax,eax //Is this the right : EndLoop?
4B0C7D <<jz loc_4B0C86 //jump if not
4B0C81 | inc [ebx+18] //output Line# to jump to after the BreakLoop
4B0C84 | pop ebx
4B0C85 ..ret
4B0C86 >>inc [ebx+18] //next line
4B0C89 |
4B0C8A --jmp
Also der Beispielcode den ich oben aufgeführt habe, funktioniert jetzt mit dieser Version.
Beide Schleifen laufen so durch wie sie sollen und am Ende kriege ich auch das "test fertig" ausgegeben.
@bugmenot: Warum so kompliziert? Was war an meiner Lösung denn falsch? (Der aus dem Edit)
Ich meinte das so:
......<> Break Loop --- Counter=0, mal End Loop suchen gehen
......<>
...: End Case
...<> Loop --- Counter=1
......<>
...: End Loop --- Counter=0
: End Loop --- Counter=-1, richtiges End Loop gefunden!
--
Mir war nichtmal bewusst dass ich nominiert wurde, aber: Cool! Hälfte des Lobes muss aber unbedingt an Archeia!
Habe mich wohl zu sehr auf eb!'s Code eingelassen und die aufgepickten :EndLoops auf richtige Zugehörigkeit überprüft... anstatt gleich das erste richtige :EndLoop suchen zu lassen...
Ich hab mir ein paar Videos über den RPG Maker VX Ace angeguckt und war total begeistert. Ich wollte mir das Programm unbedingt runterladen, aber ich habe leider ein Macbook Air. Ebenfalls durch Videos bin ich schließlich drauf gekommen, den Maker mit Wine und WineBottler zu installieren. Das habe ich gemacht, das Icon ist da. Als ich es allerdings gestartet habe, kam eine Meldung, ich hätte das RTP nicht installiert, obwohl ich mir sehr sicher war, das gemacht zu haben. Um aber wirklich sicher zu sein, habe ich es nochmal versucht. Scheinbar habe ich etwas anders gemacht, denn jetzt kommt, wenn ich den Maker öffnen möchte, immer nur folgendes Fenster: (siehe Anhang)
Was zum Teufel kann ich tun? Was habe ich falsch gemacht? Bitte dringend um Hilfe!!!
Gibt es irgendeinen Trick, um im Vollbildmodus kein verzerrtes Bild zu haben? Bei mir ist alles immer in die Breite gezerrt, ist leider nicht grade schön :/. Danke schonmal im Voraus .