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.


Vítejte v další části Ren'Py tutorialu.

Tentokrát budeme probírat jak umožnit hráči volit si cestu příběhem. Veškteré připomíky, dotazy a komentáře můžete směřovat na české Ren'Py fórum na adrese: http://denzil.ic.cz/renpy/

Jako základ skriptu použijeme skript z tutorialu o základech (vymazal jsem některé části, abych ušetřil místo):

init:
    $ config.script_version = (5, 5, 3)
    $ config.screen_width = 800
    $ config.screen_height = 600
    $ config.window_title = u"Naše hra"

    # obrázky
    image bila = Solid((255, 255, 255, 255))

    # obrázky pozadí
    image carillon = "carillon.jpg"

    # obrázky postav
    image eileen = "9a_happy.png"
    image eileen stasna = "9a_happy.png"

    # postavy
    $ e = Character(u"Eileen", color=(200, 255, 200, 255))

    $ style.mm_root.background = Image("mainmenu.png")
    $ style.gm_root.background = Image("gamemenu.png")


label start:
    scene carillon with pixellate
    show eileen stasna
    e "Ahoj, já jsem Eileen."

Tímto začneme. Po celou dobu budeme přidávat příkazy až za label start: takže dál už nebudu ukazovat init blok.

Jako první si ukážeme menu. Menu zobrazí nabídku, ze které si bude hráč moci vybrat co udělá, řekne, nebo cokoliv jiného co mu umožníte vybrat. Ukázka menu:

    menu dotaz:
        "Chtěl bys vidět menu?"

        "Ano":
            e "No to je dobře, protože jsem ti ho právě ukázala."

        "Ne":
            e "Pozdě."
            e "Právě jsem ti ho ukázala."

    # a tady už menu skončilo a pokračujeme dál normálně

Vysvětlivky:

menu dotaz:

Příkaz menu: slouží k vytvoření nabídky. Všechno co do nabídky patří je odsazeno víc než menu:. V tomto případě menu i pojmenováváme a to dotaz. Pojmenování není nutné, ale je vhodné jako pomoc v zorientování se v skriptu. Pokud by jsme chtěli nabídku beze jména napíšeme jenom menu:

"Chtěl bys vidět menu?"

První (a odsazený) řádek můžeme (ale nemusíme) použít k zobrazení nějakého textu spolu s nabídkou. Hodí se hlavně k tomu aby hráč viděl zároveň co po něm chceme a možnosti ze kterých si může vybrat. Povšimněte si, že na rozdíl od následujících řádků se stejným odsazením není na konci řádku dvojtečka. Ta signalizuje že řádek je jednou z možností z kterých lze vybírat.

"Ano":

Toto je první z možností, ze kterých si má hráč možnost vybrat. Druhá je "Ne":. Na konci řádku každé z možností je dvojtečka. Po každé z možností následuje ještě více odsazený řádek (nebo řádky), na kterých pomocí normálních příkazů zobrazíme nebo vypíšeme co se stane pokud hráč tuto monost vybere. V případě zvolení "Ano" v této ukázce se zobrazí text jak Eileen říká "No to je dobře,...". Je samozdřejmě možné použít i příkazy ke zobrazení obrázků a další. Pokud nechceme aby se po zvolení možnosti nestalo nic a pokračovalo se dál ve skriptu co následuje po menu, potom musíme na řádek po té možnosti napsat příkaz pass. Počet volitelných možností je od jedné a je omezen jenom volným místem na obrazovce.

Po tom co menu skončí pokračujeme dál, ale už s normálním odsazením, jak nám indikuje komentář.

Skript (soubor script.rpy) by teď měl počínaje label start: vypadat takto:

label start:
    $ renpy.music.play("sun-flower-slow-drag.mid")
    scene carillon with pixellate
    show eileen stasna
    e "Ahoj, já jsem Eileen."

    menu dotaz:
        "Chtěl bys vidět menu?"

        "Ano":
            e "No to je dobře, protože jsem ti ho právě ukázala."

        "Ne":
            e "Pozdě."
            e "Právě jsem ti ho ukázala."

    # a tady už menu skončilo a pokračujeme dál normálně

Po prohlédnutí a vyzkoušení si asi řeknete, že pokud by jste chtěli použít v nabídce větší množství příkazů nebo textu, tak se nabídka stane nepřehlednou. Ren'Py ovšem nabízí možnosti k zpřehlednění. Základní možnost vám teď ukážu na upravené nabídce dotaz (která ovšem z pohledu hráče funguje úplně stejně jako předchozí):

label start:
    $ renpy.music.play("sun-flower-slow-drag.mid")
    scene carillon with pixellate
    show eileen stasna
    e "Ahoj, já jsem Eileen."

    menu dotaz:
        "Chtěl bys vidět menu?"

        "Ano":
            jump ano

        "Ne":
            jump ne

label ano:
    e "No to je dobře, protože jsem ti ho právě ukázala."
    jump pokracovani

label ne:
    e "Pozdě."
    e "Právě jsem ti ho ukázala."
    jump pokracovani

label pokracovani:
    # a tady už menu skončilo a pokračujeme dál normálně

Vysvětlení:

label jmeno:

Příkaz label slouží hlavně k určení míst na které se dá skočit (co přesně to znamená si vysvětlíme za chvíli). Povšimněte si, že na rozdíl od ostatních příkazů nezí odsazen (nejsou žádné mezery mezi ním a levým krajem textu). Každé jméno (nesmí obsahovat háčky a čárky (a ů taky ne:)) se může vyskytnout ve skriptu jenom jednou. Existuje několik takových už vestavěných v Ren'Py, ale je nepravděpodobné že by jste náhodou navrhli nějaké se stejným jméneo (zvlášt pokud jim budete dávat ceske jména). A stejně jako v nabídce je na konci řádku dvojtečka. A pozor, rozlišuje se mezi malými a velkými písmeny takže label jmeno: a label Jmeno: jsou rozdílné jména!

jump jmeno

Příkaz jump slouží ke skoku na jiné místo ve skriptu. Prostě se z místa na kterém se právě hráč je se přesuneme na jiné místo. Toto místo musí být označeno pomocí příkazu label.

Takže pokud si hráč v této ukázce vybere "Ano" vykoná se příkaz jump ano, což znamená že se přeuneme na label ano:. Ten samotný nic nedělá (slouží to jenom k určení místa kam se má skočit) a tak se pokračuje na dalším řádku a zobrazí se "No to je dobře,...". Potom opět následuje skok, tentokrát na label pokracovani. V tomto případě se sice o zjednodušení nejedná, ale pokud by bylo potřeba větší množství příkazů po zvolení možnosti, pak by zpřehlednění bylo opravdu velké.

Pokud by jsme ovšem chtěli, aby zvolená možnost ovlivnila něco až později tak toto není nejvhodnější způsob, protože by jsme museli zbytečně kopírovat velké množství text a navíc pokud by jsme udělali změnu ve společné části příběhu, museli by jsme ji kopírovat i do ostatních okopírovaných částí a to by byla zbytečná práce. Naštěstí pro tento problém je tu i řešení, a tím jsou proměnné a příkaz if. Proměnné jsou v podstatě jména pod kterými si můžeme uložit to co potřebujeme. A to může být text, číslo nebo i něco jiného. S proměnnými jsme se už setkali a to hlavně v init sekci jako například:

    $ config.screen_width = 800

takže proměnnou použijeme tak, že napíšeme $ (pokud nevíte jak tak si přepněte na anglickou klávesnici a stiskněte Shift a 4), potom napíšeme jméno proměnné (opět bez českých znaků, ale také nepoužívejte tečku, ta má speciální význam), dále následuje rovnítko a za něj napíšeme co si pod tuto proměnnou chceme uložit. Pokud je to nějaký text tak musí být v úvozovkách a v případě použití češtiny před ně (uvozovky) napíšeme písmeno u (ale doporučuju psát písmeno u před každým textem). Takže když si chceme uložit do nějaké proměnné text vypadá to takto:

    $ odpoved = u"Ano."

Výhodou těchto proměnných proti těm z matematiky je, že můžeme měnit to co v nich je, takže když si do proměnné uložíme třeba číslo tak ho potom můžeme měnit podle průběhu hry Pozor, způsobem co si teď ukážeme můžeme proměnné měnit až po tom co to číslo do proměnné uložíme, ne dřív! Například:

    $ cislo = 1
    # Teď je v proměnné cislo uložené číslo 1
    $ cislo = cislo + 1
    # Teď je v proměnné cislo uložené číslo 2

Pokud vás mate proč je nakonec v proměnné cislo uložená dvojka, tak je to proto že se první vyhodnotí pravá strana výrazu (všechno napravo od rovnítka) a teprve potom se výsledek uloží do proměnné. Takže na řádku "$ cislo = cislo + 1" se první na pravé straně dosadí za cislo jeho současná hodnota (to jest 1, kterou jsme tam uložili předtím, výraz pak vlastně vypadá takto: 1+1), pak se vypočítá výraz a výsledek se uloží do proměnné cislo. Na pravé straně od rovnítka můžete používat i jiné proměnné, ale před tím než je použijete tak do nich musíte něco uložit.

A teď vás asi zajímá jak proměnné souvisí s větvením příběhu. A s tím přichází na řadu příkaz if. Ten je trochu podobný příkazu menu, ale tentokrát k rozhodování nepoužíváme volbu hráče, ale něco co máme uložené v proměnné. První ukázka:

label start:
    $ renpy.music.play("sun-flower-slow-drag.mid")
    scene carillon with pixellate
    show eileen stasna
    e "Ahoj, já jsem Eileen."

    menu dotaz:
        "Chtěl bys vidět menu?"

        "Ano":
            $ odpoved = u"Ano."
            jump ano

        "Ne":
            $ odpoved = u"Ne."
            jump ne

label ano:
    e "No to je dobře, protože jsem ti ho právě ukázala."
    jump pokracovani

label ne:
    e "Pozdě."
    e "Právě jsem ti ho ukázala."
    jump pokracovani

label pokracovani:
    # a tady už menu skončilo a pokračujeme dál normálně
    e "Tak budeme pokračovat."
    # pokud je v odpoved uležené u"Ano."
    if odpoved == u"Ano.":
        # pak se vykoná tento odsazený blok a pak se skočí na # pokračujem
        e "Ale stejně jsem ráda, že chtěls vidět menu."
    # pokud je v odpoved uloženo u"Ne."
    elif odpoved == u"Ne.":
        # vykoná se tento blok a pak by se poračovalo na # pokračujem
        e "Ale škoda, že nechtěls vidět menu."
    # a pokud by se v odpoved ocitlo něco jiného (cokoliv)
    else:
        # pak by se vykonal tento blok a pak by se pokračovalo příkazy
        # které následují za tímto blokem a mají menší odsazení
        # což znamená že na # pokračujem
        e "Tohle bys vůbec neměl vidět."
    # pokračujem

Vysvětlivky:

V menu bloku si do proměnné odpoved ukládáme "Ano." nebo "Ne." podle toho co si hráč vybere. Potom se pokračuje normálně až k příkazu if.

if odpoved == u"Ano.":

Příkaz if (česky pokud) vyhodnotí výraz mezi ním a dvojtečkou a pokud je pravdivý pak vykoná odsazené příkazy co po něm následují. Pak by se skočilo na # pokračujem (později vysvětlím proč).

odpoved == u"Ano."

Dvě rovnítka slouží k porovnání toho co je nalevo a napravo a pokud je to stejné pak výsledek výrazu je pravda a příkaz if vykoná za ním následující odsazené příkazy. Pokud vás překvapuje jak je možné, že odpoved a u"Ano." můžou být stejné pak vysvětlením je že za proměnné se dosadí to co je v nich uložené.

Je možné testovat i nerovnost pravé a levé strany a to pomocí !=. Poukd != použijeme pak výsledek výrazu bude pravdivý pokud se levá a pravá strana NEBUDOU rovnat. Pro testování čísel je možné použít ještě <, >, <= a >=, které fungují jako v matematice. Např. pokud použijeme < pak výsledkem bude pravda pokud číslo nalevo bude menší než to napravo.

Pokud by jsme chtěli testovat víc věcí najednou je to možné. Pokud chceme otestovat dva výrazy a chceme, aby oba byly pravdivé tak mezi ně vložíme and (pozor, musí být malými písmeny). Např:

    if x==1 and y==1:

Odsazené příkazy za if se vykonají jen pokud jsou oba výrazy pravdivé. Pokud by nám stačil jen jeden ze dvou výrazů pak použijeme or:

    if x==1 or y==1:

A pokud bude alespoň jedno z x==1 nebo y==1 pravdivé (ale můžou být i oba) pak se to celé vyhodnotí jako pravdivé. Je možné vyhodnocovat i více než dva výrazy, ale pokud chceme aby byly vyhodnoceny přesně tak jak chceme je lepší je dát do závorek (používají se jen kulaté):

    if (x==1 or y<=1) and z<3:

V tomto případě se první ověří výrazy v závorce a potom se výsledek ze závorky místo ní dosadí a otestuje se jestli i výraz za and je pravdivý. Pokud by tam závorka nebyla tak by stačilo aby x se rovnalo jedné a celý výraz by byl pravdivý a to nechceme, ale chceme aby zároveň z bylo menší než 5. Jen pro doplnění nejvnitřnější závorky se vyhodnocují první.

elif odpoved == u"Ne.":

Pokud by výraz v přdchozím if NEBYL pravdivý pa by se skočilo na tento řádek. Příkaz elif funguje stejně jako if ale výraz v něm se testuje jenom pokud předchozí příkaz if (nebo předchozí elif) byl vyhodnocený jako nepravdivý Pokud byl vyodnocený jako pravdivý nebo nebyl vyhodnocený vůbec, tak se tento nebude vůbec vyhodnocovat. Také je možné použít příkaz elif jenom hned za odsazeným blokem po if nebo elif. Jenom jeden neodsazený řádek a použití elif je chyba (komentáře se nepočítají, ty jediné jsou vyjímka.

else:

Pravidla pro použití jsou stejná jako u elif (hned po skončení if/elif bloku), ale narozdíl od if a elif else neslouží k testování výrazů ale rovnou vykoná po něm následující odsazený blok pokud všechny předcházející podmínky v příkazech if/elif byly vyhodnoceny jako nepravdivé (to znamená že žádný z bloků po if/elif se nevykonal).

Tak a to by bylo asi tak všechno k tomuto tématu. Pokud pořád něčemu nerozumíte, nebo potřebujete s něčím poradit pak se nebojte a zeptejte se na: http://denzil.ic.cz/renpy/