RPGMakerXP/Eventbefehle/Seite 1/Loop
- Event Befehle Seite 1
- Show Text
- Show Choices
- Input Number
- Change Text Options
- Button Input Processing
- Wait
- Comment
- Conditional Branch
- Loop
- Break Loop
- Exit Event Processing
- Erase Event
- Call Common Event
- Label
- Jump to Label
- Control Switches
- Control Variables
- Control Self Switch
- Control Timer
- Change Gold
- Change Items
- Change Weapons
- Change Armor
- Change Party Member
- Change Windowskin
- Change Battle BGM
- Change Battle End ME
- Change Save Acess
- Change Menu Access
- Change Encounter
| Ereigniskommando | ||||||||
|---|---|---|---|---|---|---|---|---|
| Englische Bezeichnung: | Loop | Break Loop | ||||||
| Deutsche Übersetzung: | ||||||||
| Position |
|
| ||||||
| Typ: | Kontrollstruktur | Kontrollstruktur | ||||||
| Farbdarstellung: | Blau | Blau | ||||||
| Interpreter | ||||||||
| Methode | Loop: command_112
Repeat above: command_413 |
command_113 | ||||||
Loops sind Schleifen, also Codefragmente die kontinuierlich wiederholt werden. Über den Loop-Befehl wird eine Schleife erzeugt. Alles, was sich zwischen dem "Loop" und dem "Repeat above" befindet, liegt in der Schleife und wird wiederholt. Eine Schleife wird mit dem Break Loop Befehl verlassen.
|
| Beispiel für eine Schleife, die 5 Mal wiederholt wird |
Loops können verschachtelt konstruiert werden. Es ist also möglich mehrere Loops innerhalb eines Loops zu positionieren.
Für gewöhnlich hat jede Schleife eine Austrittsbedingung in Form eines Conditional Branchs, welcher ein Break Loop enthält. Der Break Loop muss sich innerhalb des Loops befinden, damit er dessen Beendigung einleiten kann.
Inhaltsverzeichnis
Formen von Loops
Zählschleifen
Zählschleifen bewirken eine festgelegte Anzahl an Wiederholungen eines Codes. Hierfür wird eine Zählervariable auf 0 gesetzt und dann bei jedem Durchlauf um 1 erhöht. Sobald die Zählervariable die Anzahl an Wiederholungen erreicht hat, wird die Schleife über eine Austrittsbedingung verlassen.
Control Variables: [0001:Counter] = 0
loop
//Zu wiederholender Code
Control Variables: [0001: Counter] += 1
Conditional Branch: Variable [0001:Counter] >= //Anzahl der Wiederholungen
Break Loop
Branch end
Repeat About
Bedingungsschleifen
Bedingungsschleifen wiederholen einen Code solange, bis eine Bedingung, z.B. das Drücken einer Taste, erfüllt ist.
loop
//zu wiederholender Code
Conditional Branch: //Austrittsbedingung
Break Loop
Branch end
Repeat Above
Ersetzen von Loops durch Labels
Loops lassen sich durch Labels ersetzen. Hierbei wird statt dem Loop ein Label gesetzt und statt dem Repeat Above ein Jump to Label. Um die Labelschleife zu verlassen, muss ein weiterer Jump to Label Befehl zu einem Label außerhalb der Schleife springen.
|
|
| Vergleich: Schleife über Loop-Befehl | Schleife über Label-Befehle |
Wie man dem Beispiel entnehmen kann, sind Label-Schleifen weniger übersichtlich. Es ist daher praktischer Loops für diese Zwecke zu nutzen. Andererseits rücken Loops den Makercode ein, was bei stark verschachtelten Anweisungen die Übersicht erschweren kann. In solchen Situationen sind Labels dennoch angebrachter.
Umsetzung von Loops in RGSS
#-------------------------------------------------------------------------- # * Loop #-------------------------------------------------------------------------- def command_112 # Continue return true end
Ähnlich wie auch beim Label, wird command_112, welches den Eintritt des Loops beschreibt, vom Interpreter weitgehend ignoriert. Die Methode gibt true zurück, um dem Interpreter mitzuteilen, dass das Ereigniskommando durchgeführt wurde.
#-------------------------------------------------------------------------- # * Repeat Above #-------------------------------------------------------------------------- def command_413 # Get indent indent = @list[@index].indent # Loop loop do # Return index @index -= 1 # If this event command is the same level as indent if @list[@index].indent == indent # Continue return true end end end
Die Methode command_413 speichert die momentane Tiefe, also die Anzahl der Einrückungen, der Codezeile Repeat Above in die Variable indent. Danach rückt der Indexwert @index von der Repeat Above Zeile aus nach oben, bis eine Codezeile gefunden wird, deren indent-Wert gleich dem Objekt indent ist (die also gleich eingerückt wie die Repeat Above Zeile ist). Durch das Vergleichen der indent-Werte wird sichergestellt, dass bei mehreren verschachtelten Loops nicht versehentlich zum falschen Loop gesprungen wird. Danach wird die Methode beendet und gibt den Wert true zurück.
#-------------------------------------------------------------------------- # * Break Loop #-------------------------------------------------------------------------- def command_113 # Get indent indent = @list[@index].indent # Copy index to temporary variables temp_index = @index # Loop loop do # Advance index temp_index += 1 # If a fitting loop was not found if temp_index >= @list.size-1 # Continue return true end # If this event command is [repeat above] and indent is shallow if @list[temp_index].code == 413 and @list[temp_index].indent < indent # Update index @index = temp_index # Continue return true end end end
Das Objekt indent nimmt den Wert der aktuellen Tiefe an. Der Index der Zeile Break Loop wird in das Objekt temp_index geschrieben. Nun wird der temp_index solange um 1 erhöht (der Code wird also von der Break Loop Zeile aus nach unten gelesen), bis eine Repeat Above Zeile gefunden wird, deren Tiefe kleiner ist als die in indent (welche also weniger eingerückt ist). Das Überprüfen des indent-Wertes garantiert, dass bei mehreren, verschachtelten Loops nicht versehentlich der falsche Loop abgebrochen wird. Das Objekt @index nimmt nun den Wert der Repeat Above Zeile an. Die Methode wird beendet und gibt true zurück. Wenn keine passende Repeat Above Zeile gefunden wird, bricht die Methode mit dem Rückgabewert true ab. Dies dürfte aber, solange man das Eventscript über den Maker eingibt, eine unmögliche Situation sein.

