This page is out of date

You've reached a page on the Ren'Py wiki. Due to massive spam, the wiki hasn't been updated in over 5 years, and much of the information here is very out of date. We've kept it because some of it is of historic interest, but all the information relevant to modern versions of Ren'Py has been moved elsewhere.

Some places to look are:

Please do not create new links to this page.


Den Handlungsverlauf aufteilen und wieder vereinen

Kleinere Verzweigungen können komplett mit der "menu"-Anweisungen umgesetzt werden, indem der komplette Handlungszweig unter der Menüauswahl eingerückt ist. Für größere Handlungszweige wäre das aber auf Dauer sehr umständlich. Die Lösung dafür ist, Labels und die - oder -Anweisung zu verwenden.

Zuerst muss man sich zwischen "call" und "jump" entscheiden. Jump springt einfach an eine andere Stelle des Ren'Py-Skripts, mehr nicht. Vom angesprungenen Ziel aus geht es normal weiter, es gibt keine Möglichkeit, zurückzuspringen (außer indem man wiederum ein Label kurz nach der ursprünglichen Stelle anspringt). Es ist aber nicht möglich, von verschiedenen Stellen aus einen Handlungsast anzuspringen und trotzdem immer zum richtigen wieder zurückzukehren. Für viele Visual Novels reicht "jump" aber.

Im Unterschied dazu speichert "call" die aktuelle Position, bevor gesprungen wird, sodass später automatisch wieder an die alte Stelle zurückgekehrt werden kann. Auf diese Weise können einzelne Handlungsäste leicht von verschiedenen Stellen aus wiederverwendet werden. "call" ist damit besonders für Dating Sims interessant.

Man kann natürlich beide Typen im selben Projekt verwenden.

Mit jump verzweigen

Zuerst muss man die Stellen, die angesprungenen werden sollen, im Skript mit der -Anweisung markieren:

label juwelier:
b "Komm, gehen wir zum Juwelier! Ich möchte dir etwas kaufen."

s "Du bist so lieb!"

Als nächstes fügen wir die Sprunganweisung hinzu, um diesen Handlungszweig anzuspringen: Next, you add the jump to the branch:

s "Was willst du tun?"

menu:
    "Zum Juwelier gehen":
        jump juwelier
        #alles was in diesem Block noch kommt, wird nicht mehr aufgerufen, weil "jump" nicht zurückkehrt.
    "Nichts":
        s "Oh ist das langweilig."

Glückwunsch, die Handlung wurde mit einem "jump" verzweigt.

Sofern der Handlungszweig nicht direkt zum Ende des Spiels führt, wird man irgendwann vermutlich wiederum irgendwo anders im Skript hinspringen wollen. Das geht wieder genauso - man kann auch innerhalb eines Handlungsweiges wiederum andere Handlungszweige anspringen. Sagen wir zum Beispiel, dass wir nach dem Juwelier-Handlungszweig an die Stelle gleich nach dem Menü springen wollen. Zuerst fügt man an diese Stelle ein Label hinzu, damit man sie anspringen kann:

s "Was willst du tun?"

menu:
    "Zum Juwelier gehen":
        jump juwelier
        #alles was in diesem Block noch kommt, wird nicht mehr aufgerufen, weil "jump" nicht zurückkehrt.
    "Nichts":
        s "Oh ist das langweilig."

label was_tun:
b "Und, was jetzt?"

Anschließend fügt man ein "jump" ans Ende des Handlungszweigs hinzu:

label juwelier:
b "Komm, gehen wir zum Juwelier! Ich möchte dir etwas kaufen."

s "Du bist so lieb!"

b "Ich weiß."

s "Okay, ich hab genug. Gehen wir wieder."

jump was_tun

Beachte, dass die Namen von Labels immer eindeutig sein müssen.

Mit call verzweigen

Der erste Schritt ist es, den aufzurufenden Abschnitt mit einem und einer -Anweisung zu versehen:

label juwelier:
    b "Komm, gehen wir zum Juwelier! Ich möchte dir etwas kaufen."

    s "Du bist so lieb!"

    [usw.]

    return

HINWEIS: es ist wirklich wichtig, dass solch ein Block, der über einen "call" aufgerufen werden soll und damit eine return-Anweisung besitzt nicht mit einem "jump" aufgerufen wird, weil das "return" dann den Ablauf der Spielausführung durcheinander bringt. Wenn nie ein "call" zuvor kam, wird ein "return" zum Beispiel so verstanden, dass das Spiel sofort beendet werden soll (also ein "return" zum Hauptmenü).

Als nächstes wird der Aufruf des eben erstellten Unterabschnitts hinzugefügt:

s "Was willst du tun?"

menu:
    "Let's go to the jewelry store":
        call juwelier
        s "Das hat Spaß gemacht."
    "Nichts":
        pass

Glückwunsch, jetzt du hast eine Verzweigungen mit einem "call". Leider war das aber noch nicht alles.

Es ist zwar alles geschrieben, was geschrieben werden muss, doch bevor das Spiel veröffentlich wird, muss noch einmal der Menüpunkt "Calls aufbereiten" im Tools-Menü aufgerufen werden; es fügt jedem "call"-Aufruf noch einen "from"-Zusatz hinzu, der intern benötigt wird. Du musst die Details nicht verstehen, hauptsache der Menüpunkt wird aufgerufen.

Die Handlung beenden

Deine Geschichte kann ein oder auch mehrere verschiedene Enden haben. Spiele mit nur einem Ende werden zur Abgrenzung zu den normalen Visual Novels häufig Kinetic Novels genannt.

Wenn der Spieler das Ende erreicht, sollte das natürlich ein besonderes Ereignis sein. Vielleicht ein extra Bild oder eine Animation, zumindest aber ein Bildschirm, auf dem "ENDE" steht.

Wenn dein Spiel mehrere Enden hat, macht es vielleicht Sinn, jedem Ende einen Namen zu geben, oder sie zumindest durchzunummerieren. Das hilft den Spielern, sich untereinander über das Spiel zu unterhalten, da man so weiß, dass alle über dasselbe Ende reden ohne den genauen Handlungsablauf beschreiben (und damit spoilern) zu müssen.

Angenommen, die Handlung geht um einige Freunde, die eine Party planen. Du hast ein hübsches Abschlussbild einer großen Feier auf die übliche Weise definiert:

init:
    image party ending = "party.jpg"

Wenn in der Endszene noch etwas Text angezeigt wird, ist sie sehr einfach zu schreiben:

"Chris lächelte."
c "Nun, lasst und loslegen!"

scene party ending
"Und alle feierten glücklich miteinander.   \n\nEnde 3 - Nachbarschaftsparty"

return

Das "return" weist Ren'Py an, dorthin zurückzukehren, wo es vor dem Start des Spiels war - also das Hauptmenü des Spiels.

Wenn Ren'Py Text anzeigt, wartet es immer, bis der Spieler eine Taste drückt, daher ist die Endszene kein Problem.

Wenn man aber ein Bild ohne zusätzlichen Text anzeigen will, ist das etwas komplizierter.

Wenn man schreibt:

"Chris lächelte."
c "Nun, lasst und loslegen!"

scene party ending

return

Dann wird das Party-Bild nur ganz kurz aufblinken und das Spiel sofort wieder zum Hauptmenü zurückkehren. Wir müssen Ren'Py anweisen zu pausieren, damit der Spieler das Artwork genißen kann.

Zum Glück ist das doch nicht so kompliziert: die Anweisung lautet $ renpy.pause().

Also etwa so:

"Chris lächelte."
c "Nun, lasst und loslegen!"

scene party ending

$ renpy.pause() 

return

Nun wird das Bild so lange angezeigt, bis der Spieler die Maustaste drückt.

Wie Verzweigungen strukturiert werden

Es gibt nicht die eine Art, Verzweigungen zu strukturieren. Es ist aber sehr empfehlenswert, dass du für dich selbst ein System überlegst, wie der Code mit den verschiedenen Verzweigungen noch übersichtlich bleibt.

Du kannst mehrere Dateien verwenden um das Projekt zu strukturieren; beachte dabei aber, dass jedes Label über alle Dateien hinweg eindeutig sein muss und man von überall aus jedes Label anspringen kann, unabhängig davon, ob es in der selben Datei ist oder nicht.

Category: Ren'Py Web-Tutorial