Vzdálenosti
Chystání na začátek
Na začátek si zase uděláme tři změny:
Zjednodušení počítání
Abychom měli jednodušší počítání, tak náš sprajt číslo jedna necháme pohybovat
jen doleva a doprava. Ale nemusíme mazat tu část kódu která dělá pohyb nahoru a
dolů, můžeme ji takzvaně “zakomentovat”. To znamená, že ji počítač nebude číst,
ale my ji uvidíme, kdyby se nám náhodou hodila. Uděláme to tak, že před tuto
část kódu napíšeme na samostatný řádek --[[ a za tu část kódu (kterou nechceme
použít) napíšeme (zase na samostatný řádek) ]]. Naše funkce _update() bude
vypadat takto:
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
]]
py=py+1
if py > 127 then
py=0
end
end
Vyznačení okraje
A abychom si ukázali kde je konec obrazovky, tak si zatím můžeme nakreslit pozadí nějakou barvou. Většině funkcí které kreslí na obrazovku můžeme říct jakou barvou má kreslení udělat. Pokud chceme například pozadí barvy nebe, tak funkci která čistí obrazovku můžeme říct, že ji má vyčistit barvou č. 12. Naše vykreslovací funkce by potom vypadala takto:
function _draw()
cls(12)
spr(1,x,y)
spr(2,px,py)
print(cislo)
end
Přejmenování proměnné
Nebudeme potřebovat proměnnou cislo, ale budeme potřebovat uchovávat skóre.
Přejmenujme tedy (přepíšeme všude kde se vyskytuje) proměnnou cislo na
proměnnou score a místo náhodného čísla ji na začátku nastavíme na nulu. Naše
startovací (“inicializační”) funkce tedy bude vypadat takto:
function _init()
x=60
y=120
px=60
py=0
score=0
end
A vykreslovací se změní na:
function _draw()
cls(12)
spr(1,x,y)
spr(2,px,py)
print(score)
end
Když hru pustíme teď, tak máme skóre 0, ale může být špatně vidět kvůli barvě.
Note
Zvládli byste vymyslet jak změnit barvu skóre na bílou (barva č. 7)?
Volání funkce print() můžeme také říct barvu jakou má napsat co po ní chceme.
Přepišme tedy print(score) na print(score, 7) ve funkci _draw().
Kontrola pozice sprajtů
Náš sprajt může pořád vyjet z obrazovky a to nechceme. My nechceme aby se pohnul doprava kdykoliv je zmáčknutá klávesa vpravo. My chceme aby se pohnul doprava pokud je zmáčknutá šipka doprava a zároveň není sprajt na pravém kraji (a to stejné na druhou stranu).
Protože má obrazovka šířku 128 a my používáme sprajt o šířce 8, je sprat nakraji pokud je od levého okraje vzdálen 120. A protože chceme aby se mohl pohnout doprava jen když nakraji není, můžeme to napsat jako podmínku “pokud je x menší než 120” tedy if x < 120. Když chceme spojit dvě podmínky, můžeme to udělat podobně jak je napsáno výše. A protože chceme pohnout doprava když je x < 120 a btn(➡️). A jak se napíše anglicky spojka “a”? Ano, je to and. Takže podmínku na pohyb doprava změníme na x < 120 and btn(➡️). Sprajt už by nám neměl nikdy ujet doprava mimo obrazovku.
Tip
Zkuste udělat to stejné pro druhou stranu
Doleva chceme pohnout sprajtem jen když není na pravém okraji. Nebo si to můžeme představit tak, že nechceme aby se x dostalo pod nulu. Takže podmínka na pohyb doleva bude x > 0 and btn(⬅️). A to bysme měli.
Kontrola doteku sprajtů
Pokud náš hráč (sprajt 1) chytne (dotknou se) padající věc (sprajt 2), tak chceme aby se nečekalo až druhý sprajt spadne mimo obrazovku, ale resetoval se hned jak se dotknout. Ale protože budeme resetovat pozici druhého sprajtu (proměnné px a py) ve dvou různých situacích, tak si tuto akci můžeme napsat do vlastní funkce.
Napišme si tedy funkci na reset pozice druhého sprajtu. Nazveme ji třeba “padej”. Toto musíme přidat někde mimo existující funkce, třeba úplně nakonec:
function padej()
py=0
px=rnd(120)
end
Potom tuto funkci můžeme zavolat tam kde se resetovaly hodnoty proměnných px a py stejným způsobem. Například funkce _init() by teď měla vypadat takto:
function _init()
x=60
y=120
padej()
score=0
end
A teď na kontrolu doteku. Vzhledem k tomu, že náš hráč (sprajt 1) je pořád na Y pozici 120, nemusíme pokaždé počítat jak daleko nahoru od něj je druhý sprajt. Víme, že jakmile bude o 8 pixelů výše (py bude 112), tak se nedotýkají, ale jakmile bude byť jen o jeden pixel méně, tak už se můžou dotknout. První část podmínky na dotek sprajtů tedy bude py > 112.
Pojďme si napsat tuto podmínku a spojit ji s již existující podmínkou toho, že
sprajt spadne pod konec obrazovky. Původně jsme si ukázali jen “jednoduchý
if”, tentokrát ho vylepšíme.
Pojďme se podívat na další jeho variantu:
if <PODMÍNKA> then
-- IF BLOK
else
-- ELSE BLOK
end
To znamená, že -- IF BLOK se vykoná pouze pokud je první podmínka pravdivá,
jinak (else, pokud není pravdivá) se vykoná -- ELSE BLOK. A nejen to,
můžeme přidat více podmínek:
if <PODMÍNKA_1> then
-- BLOK_1
elseif <PODMÍNKA_2> then
-- BLOK_2
else
-- ELSE BLOK
end
V tomto případě se napřed zkontroluje <PODMÍNKA_1>. Pokud je tato pravdivá,
tak se vykoná BLOK_1. Pokud není, tak se zkontroluje <PODMÍNKA_2>. Pokud
je tato pravdivá, tak se vykoná BLOK_2. Těchto elseif podmínek a bloků může
za sebou být mnohem víc. Na konci může (ale nemusí) být else a za ním kód
který se vykoná pokud žádná z předchozích podmínek nebyla pravdivá.
Warning
Každá podmínka má za sebou
then, aleelseuž ne. Nezapomeňte na to. Můžete si to pamatovat podle toho, že řeknete “jestli (if) něco (<podmínka>) tak (then) … jinak jestli (elseif) něco jiného (<podmínka>) tak (then) … jinak (else) … – i v české řeči to dává smysl.
A tak si naši podmínku na kontrolu “propadeného” sprajtu 2, která zatím vypadá takto:
if py > 127 then
padej()
end
tak, aby ještě zkontrolovala jestli je sprajt 2 blízko našemu hráči:
if py > 127 then
padej()
elseif py > 112 then
-- chytame
padej()
end
Teď je ale sprajt vyresetovaný pokaždé když se přiblíží na výšku hráče, ale už nekontroluje jestli není moc daleko doleva nebo doprava. Na tuto kontrolu můžeme použít funkce na absolutní hodnotu, ale my, abychom se naučili jak podmínky takzvaně “zanořovat”, si ty dvě možnosti rozepíšeme.
Aby se sprajty dotkly, musí být méně než 8 pixelů od sebe na výšku, ale zároveň
méně než 8 pixelů na šířku. Vzdálenost doleva/doprava nemá cenu kontrolovat
pokud není py větší než 112. V našem případě napíšeme novou kontrolu do části
(bloku) kde je komentář -- chytame.
Vysvětlení počítání
Když je jablko vlevo


Když je jablko vpravo


Převedení do kódu
Následují složitou větu si převedeme do kódu:
Pokudje pozice X sprajtu 2 (px)větší nežkolik by byla8pixelůvlevood pozice X našeho hráče (x),azároveň je pozice X sprajtu 2 (px)menší nežkolik by byla8pixelůvpravood pozice X našeho hráče (x)tak
if px > x - 8 and px < x + 8 then
V tomhletom případě se sprajty dotýkají (nemusí se přímo kreslit přes sebe, ale nám stačí, že roh jednoho (i když nevybarvený) zasahuje do druhého.
Počítání skóre
Tipy navíc
- Změňte rychlost padání tak, ať je hra těžší.
- Změňte rychlost pohybu doleva/doprava tak ať je hra rychlejší, ale pořád zajímavá.
- Přidejte si proměnnou která určuje rychlost pohybu doleva/doprava abyste při experimentování nemuseli měnit více než jedno číslo.
- Změňte rychlost padání ať je trošku náhodná.
Important
Jak byste udělali hru zajímavější vy?