RPGMakerXP/Eventbefehle/Seite 1/Loop

Aus Scientia
Wechseln zu: Navigation, Suche
Ereigniskommando
Englische Bezeichnung: Loop Break Loop
Deutsche Übersetzung:
Position
Seite 1 linke Spalte Zeile 9
Seite 1 linke Spalte Zeile 10
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.

Xp loopbeispiel.png
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.

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.

Xp loopbeispiel.png Xp looplabelersatz.png
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.

Verwandte Themen