Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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, ale else už 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

Jablko vlevo - čísla

Jablko vlevo - proměnné

Když je jablko vpravo

Jablko vpravo - čísla

Jablko vpravo - proměnné

Převedení do kódu

Následují složitou větu si převedeme do kódu:

Pokud je pozice X sprajtu 2 (px) větší než kolik by byla 8 pixelů vlevo od pozice X našeho hráče (x), a zároveň je pozice X sprajtu 2 (px) menší než kolik by byla 8 pixelů vpravo od 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?