Podmínky a tlačítka
Od této hodiny se nám může hodit Cheat Sheet na PICO-8, je sice v angličtině, ale my stejně budeme používat jen malou část a jen pro připomenutí.
Organizace kódu
Protože budeme měnit více a více věcí, hodí se nám mít v kódu trošku pořádek.
V PICO-8 jsou nejčastěji použity tři funkce, at to:
_init():- pustí se jednou na začátku
- používá se na nastavení počátečních věcí
_update():- pouští se 30× za vteřinu
- používá se na reakci na tlačítka, pohyb, atd.
_update60():- pouští se 60× za vteřinu
- jinak stejná jako
_update() - my ji nebudeme potřebovat
_draw():- pouští se jednou za vykreslení obrazovky
- používá se na vykreslení sprajtú, obrázků, mapy, pixelů atd.
My už dvě z těchto funkcí známe. Náš kód by se dal ale pěkně rozdělit mezi
_init(), _update() a _draw() pěkně logicky.
Na konci minulé lekce jsme měli, i s pohybem sprajtu, něco jako toto:
function _init()
sprite=1
x=60
y=60
n=1
end
function _draw()
cls()
print(n)
n=n+1
spr(sprite, x, y)
x=x+1
y=y-2
end
Pokud ve funkci _draw() ponecháme jen řádky které vykreslují něco na obrazovku
a všechny ostatní přesuneme do nové funkce _update(), tak bude náš kód vypadat
nějak takto:
function _init()
sprite=1
x=60
y=60
n=1
end
function _update()
n=n+1
x=x+1
y=y-2
end
function _draw()
cls()
print(n)
spr(sprite, x, y)
end
Tip
Tady si můžete procvičit standardní práci s textem jako je označování (
Shift + ←→↑↓), kopírováni (Ctrl + C, vyjímáníCtrl + Xa vkládáníCtrl + V) které funguje jako na většině míst kde se upravuje text.
Čtení stavu tlačítka
Na to abysme zjistili jestli je zmáčknuté tlačítko, tak můžeme použít funkci
btn() které v závorkách řekneme na jaké tlačítko se ptáme. Pokud se tedy
budeme chtít zeptat na šipku doprava, tak tu v PICO-8 editoru napíšeme jako
velké písmeno “R” (od anglického “right”, tedy “vpravo”), tudíž Shift + R. V
kódu se nám potom objeví šipečka doprava, volání funkce bude tedy potom vypadat
asi takto:
btn(➡️)
Tato funkce ale neudělá nic jiného, než že “vrátí” jestli je šipka doprava
zmáčknutá, pokud ano, tak true, jinak false. To, že funkce něco “vrátí”
(nějakou hodnotu) znamená, že se dá použít podobně jako proměnná. Pojďme si ji
tedy vypsat místo našeho čísla n. Tu už nebudeme potřebovat a můžeme ji z
našeho kódu smazat:
function _init()
sprite=1
x=60
y=60
end
function _update()
x=x+1
y=y-2
end
function _draw()
cls()
print(btn(➡️))
spr(sprite, x, y)
end
Když teď pustíme hru (můžeme použít zkratku Ctrl + R) tak nám sice sprajt
odjede, ale v levém horním rohu bude nápis “FALSE” který se změní na “TRUE”
kdykoliv budeme držet šipku doprava!
Reakce na tlačítka – podmínky
Teď přijde nejsložitější část dnešní lekce, ale taky ta nejlepší.
V naší funkci _update() pohybujeme naším sprajtem doleva/doprava a nahoru/dolů
(podle toho jaká čísla jsme přičetli nebo odečetli od proměnných X (to jak
daleko je sprajt od levé strany obrazovky) a Y (to jak daleko je shora
obrazovky).
Pojďme upravit tuto funkci tak, aby se nám sprajt posouval jen vodorovně. To
znamená, že nebudeme měnit hodnotu proměnné Y (tento řádek smažeme) a necháme
jen řádek kde měníme X.
function _update()
x=x+1
end
Teď se nám sprajt bude pohybovat jen po ose X, ale bude to dělat pořád a vždy
uteče z obrazovky. Pokud bychom chtěli aby se hodnota X změnila jen když
držíme tlačítko doprava, musíme použít “podmínku”.
Základní podmínkou ve většině programovacích jazyků je if, což znamená
“jestli”. Když chceme napsat “jestli je zmáčknuté tlačítko doprava” známe už
většinu toho co potřebujeme:
- jestli –
if - je zmáčknuté tlačítko doprava –
btn(➡️)
a když se podíváme na náš Cheat Sheet (odkaz na začátku stránky) tak nápověda
která začíná if ... tak jsou to dva řádky. První z nich, IF (TRUE) CLS(),
je zkrácená verze která nám časem může pomoci, ale zatím ji vynecháme. Druhá
verze:
if <PODMÍNKA> then
-- IF BLOK
elseif <PODMÍNKA> then
-- ELSEIF BLOK
else
-- ELSE BLOK
end
Note
Cokoliv je napsáno za dvěma pomlčkami
--jsou jen komentáře. To znamená něco, co je tam napsáno jen pro lidi co kód čtou, ale počítač to přeskočí.
Cokoliv je napsáno na řádku místo -- IF BLOK se pustí (vykoná) jen pokud je
<PODMÍNKA> pravdivá.
Bloky ELSEIF a ELSE teď nebudeme potřebovat, ale musíme v programu nějak
označit kde kód podmínky končí. Na to, stejně jako u funkcí, použijeme klíčové
slovo end.
V porovnání s naším if btn(➡️) nám chybí jen tři věci:
then– klíčové slovo za podmínkou,- “IF BLOK” – kód který chceme aby se pustil “jen někdy” (podmíněně) a
end– ukončení takzvanéhoif-u.
Naše podmínka bude to, jestli je zmáčknuté tlačítko doprava, neboli pravá šipka.
A náš kód který chceme aby se pustil podmíněně je ten řádek kde měníme X.
Pokud tedy nad řádek kde modifikujeme X napíšeme naše if btn(➡️) then a pod
něj end, bude naše funkce _update() vypadat nějak takto:
function _update()
if btn(➡️) then
x=x+1
end
end
Pusťte hru a zkuste co dělá šipka doprava. Měla by hýbat se sprajtem doprava.
Warning
Někomu se může sprajt pohybovat na druhou stranu, podle toho jak původně modifikovali proměnnou
X, pokud jde na špatnou stranu, zkuste přijít na to proč. Můžou pomoci v Cheat Sheetu naznačené souřadnice obrazovky.
Finální úkoly
Teď máme tři řádky které se starají o pohyb doprava. Přidání řádků které by způsobily pohyb doleva je docela jednoduché. Zkuste vymyslet sami jak to udělat. Když si nebudete vědět rady, tak tady je pár tipů. Zkuste jich přečíst co nejméně:
- Stačí nám upravit funkci
_update(). - Myší (nebo pomocí
Shift-u a šipek) označte tři řádky (odifaž doend), zkopírujte (Ctrl + C), šipkami (nebo myší) najeďte mezi ty dvaend-y a zkopírované řádky vložte (Ctrl + V) a upravte rozdíly mezi pohybem doprava a doleva. - Rozdíly jsou dva.
- První rozdíl je tlačítko na které chceme reagovat.
- Druhý rozdíl je v tom co chceme udělat s proměnnou
X. - Místo tlačítka vpravo chceme kontrolovat tlačítko vlevo. Šipku vlevo napíšeme
pomocí
Shift + L(“L” jako “left” – z anglického “vlevo”). - Proměnnou
Xnechceme zvětšovat, ale zmenšovat, takže místo+napíšeme-.
Funkce _update() by těď měla vypadat asi takhle:
function _update()
if btn(➡️) then
x=x+1
end
if btn(⬅️) then
x=x-1
end
end
Kdo chce si teď může vyzkoušet doplnit pohyb nahoru a dolů.
Tip
Zkuste sami přijít na všechno co je potřeba doplnit.
Tipy na přidání pohybu nahoru a dolů:
- Zkopírujte si (podobně jako předtím) všech šest řádků pohybu doleva a doprava a upravte je.
- Šipky nahoru a dolů se píšou podobně, nahoru je anglicky “up” a dolů je “down”.
- Nový pohyb není po ose
X. - Pohyb nahoru bude kontrolovat tlačítko
⬆️(Shift + U). - Pohyb dolů tlačítko
⬇️(Shift + D). - Pohyb nahoru je směrem k hornímu řádku kde je
Ynula, takže jej potřebujeme zmenšovat, takže potřebujemey=y-1. - Pohyb dolů je opačně jako pohyb nahoru, takže potřebujeme
y=y+1.
Nakonec by naše “hra” s celou funkcí _update() měla vypadat takto:
Tip
Podívejte se i na to jak jsou řádky odsazené (kolik mezer mají zleva) a jak jsou mezi nimi volné řádky. Mít pořádek v kódu znamená lepší orientaci až s ním budeme dále pracovat!
function _init()
y=60
x=60
end
function _update()
if btn(➡️) then
x=x+1
end
if btn(⬅️) then
x=x-1
end
if btn(⬆️) then
y=y-1
end
if btn(⬇️) then
y=y+1
end
end
function _draw()
cls()
spr(1,x,y)
print(btn(➡️))
end