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.
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:
"Chtěl bys vidět menu?"
"Ano":
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:
jump jmeno
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.":
odpoved == u"Ano."
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.":
else:
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/