Maž bodky a chytaj muchu

Čo budeme robiť

  • pomocou myši budeme klikať na korytnačky, ukrývať ich a znovu ukazovať, pohybovať korytnačkami

Čo už musíme vedieť

  • pracovať s udalosťami na korytnačke, pracovať s tlačidlami

Naučíme sa

  • spúšťať procesy, pomenovávať procesy, zastavovať konkrétne procesy, meniť tvar myši na obrazovke

Navrhujeme projekt Maž bodky

Tí, čo riešili súťaž Cologobežka si možno spomenú na jednoduchý projekt, v ktorom sme mazali bodky: na stránke sa nachádza niekoľko bodiek, úlohou hráča je klikať na bodky – vtedy bodka zmizne – a takto zmazať všetky bodky.

Analyzujeme projekt Maž bodky

  1. Bodky budú zrejme korytnačky, ktoré budú mať tvar čiernej bodky.
  2. Budú reagovať na udalosť priĽavomDolu tým, že sa skryjú.

Naprogramujte samostatne takýto projekt!

Ak máte na nápad na podobný projekt, ktorý využíva kliknutia na statické objekty a pripravíte ho, ho nezabunite nám ho poslať, radi ho uverejníme na www stránke.
Ak potrebujete pomôcť, kliknite sem.

Navrhujeme projekt Mucha

Veľmi podobnou hrou je projekt mucha – okrem toho, že sa na stránke nachádza korytnačka-mucha, ktorú budeme chytať mucholapkou, tak sa táto mucha aj nejakým spôsobom pohybuje.

Analyzujeme projekt Mucha

Zrejme potrebujeme obrázky muchy, "chytenej" muchy a samotnej mucholapky – nakreslite ich v LogoMotion alebo si ich stiahnite ako samorozbaľovací exe súbor (34 KB).

Obrázok muchy nakreslime tak, aby mala mucha niekoľko natočení. Aby obrázok v Imagine reagoval na zmenu smeru pravoklikneme do dolnej časti a vyberme možnosť Podľa uhla. Všetky 3 obrázky zapíšme na disk napr. s názvami mucha.lgf, chytena.lgf a mucholapka.lgf.

Korytnačka bude opäť reagovať na ľavé tlačidlo myši, teraz však tak, že zmení svoj tvar na obrázok chytenej muchy a zastaví svoj pohyb.

Programujeme projekt Mucha

Príkazmi v riadku:
? urob "mucha obrázokZoSúboru "mucha.lgf 
? urob "chytena obrázokZoSúboru "chytena.lgf 
? urob "mucholapka obrázokZoSúboru "mucholapka.lgf 

načítajme všetky pripravené obrázky do pamäte Imagine. Obrázky si do pamäte pripravujeme preto, že ich budeme neustále potrebovať – budeme meniť tvar korytnačky počas spustenia projektu. Nie je vhodné spoliehať sa na to, že s naším projektom si niekto prekopíruje aj súbory s obrázkami. Okrem toho, keď súbor zapíšeme pre web k súborom s obrázkami sa na webe nedá dostať – operácia s diskom sú v Imagine na webe zakázané.

Presvedčme sa, že v pamäti vznikli tieto 3 premenné

Korytnačke zmeňme tvar na muchu.

Z riadku vyskúšajme spustenie 2 procesov – jeden bude muchu hýbať, druhý ju bude otáčať:
? každých 60 [do 2] každých 800 [vp ?]
 

Mucha sa hýbe. Zastavme procesy – F12.

Definujme udalosť priĽavomDolu na muche:
nechTvar :chytena zastavVšetky

Opäť rozbehnime z riadku predchádzajúce procesy a vyskúšajme chytať muchu.

 

Nakoniec vložme na stránku tlačidlo, ktoré priZapnutí zmení tvar myši – využijeme základný príkaz zmeňTvarMyši, zmení tvar muchy na pôvodnú (nechytenú muchu) a rozbehne procesy pohybu a otáčania muchy:
 zmeňTvarMyši :mucholapka 
 nechTvar :mucha 
 každých 60 [do 2] 
 každých 800 [vp ?]

Opäť si uvedomme, že hoci sme tu zapísali príkazy do viacerých riadkov, v udalosti priZapnutí budú v jednom riadku.

Vylepšujeme projekt Mucha

Zrejme každého napadne, že kopírovaním cez schránku si môžeme vytvoriť niekoľko múch.

Vložme na stránku muchu-kópiu našej k1. Po stlačení tlačidla sa nová mucha nehýbe – malo by nám napadnúť, že zrejme nie je oslovená – to napravíme ľahko, keď do riadku zapíšeme:
? odteraz všetky

Potom sa už po stlačení tlačidla rozhýbu obe muchy, ale pri chytení jednej z nich sa zastaví aj druhá mucha.

Prečo?

V udalosti priĽavomDolu sa zastavia všetky procesy, t.j. aj proces, ktorým sa hýbe druhá mucha.

To sa dá napraviť niekoľkými spôsobmi:
  • každej muche môžeme spustiť trochu iné procesy – pre 2 muchy by sa zrejme dá vymyslieť, aj keď proces otáčania o náhodný uhol musíme zmeniť na nejaký konkrétny uhol
  • zmeňme udalosť priZapnutí tlačidla t1:
  • zoberme do schránky (<Ctrl>+X) všetky príkazy, ktoré sú v nej a namiesto nich zapíšme meno nášho vlastného príkazu, ktorý o chvíľu navrhneme:
  • prejdime do záložky procedúry, pridajme procedúru nováHra, do ktorej vložme príkazy zo schránky a pridajme spustenie procesov pre korytnačku k2
viem nováHra
 zmeňTvarMyši :mucholapka
 nechTvar :mucha
 k1'každých 60 [do 2]
 k1'každých 800 [vp ?]
 k2'každých 60 [do 3]
 k2'každých 800 [vp 10+náhodne 100]
koniec

Tento krok navrhnutia nášho vlastného príkazu sme urobili hlavne kvôli prehľadnosti celého programu. Príkazy sme mohli dopísať aj do riadku priZapnutí, avšak celý riadok by bol príliš dlhý a nedalo by sa v ňom dobre orientovať. Keď napíšeme novú procedúru, môžeme príkazy zarovanávať a dávať do viacerých riadkov.

 

Stlačme tlačidlo t1 a vyskúšajme v riadku:
? zo všetkyProcesy
[@Riadok [do 2] [vp ?] [do 3] [vp 10 + náhodne 100]]

Keď teraz klikneme na niektorú z múch, ešte stále sa zastavia všetky procesy, ale z výpisu vidíme, že každý z nich vyzerá inak a tak môžeme opraviť udalosť priĽavomDolu oboch múch tak, aby každá z nich zastavila nie všetkyProcesy ale iba tie, ktoré sme spustili pre ňu.

Prejdime do dialógu Zmeň k1 a zmeňme jej udalosť tak, že zastaví iba procesy [do 2] a [vp ?]

Podobne pre k2.

Vyskúšajme projekt – ak chytíme jednu muchu, zastaví sa iba ona a druhá sa hýbe ďalej.

Takto môžeme pridávať ďalšie muchy, vymýšľať im iné procesy a potom ich zastavovať v ich udalosti priĽavomDolu.
 

Druhá možnosť, ako zastaviť iba konkrétny proces je, že ho pri jeho spustení pomenujeme.

Opravme teda procedúru nováHra tlačidla t1:
viem nováHra
 zmeňTvarMyši :mucholapka
 nechTvar :mucha
 (k1'každých 60 [do 2] "k1h)
 (k1'každých 800 [vp ?] "k1o)
 (k2'každých 60 [do 2] "k2h)
 (k2'každých 800 [vp ?] "k2o)
koniec

Spustime procesy stlačením tohto tlačidla a opäť si nechajme vypísať všetky idúce procesy
? zo vsetkyprocesy
[@Riadok k1h k1o k2h k2o]

Vidíme, že hoci sú procesy rovnaké t.j. [do 2] a [vp ?], keď sme ich pomenovali, sú navzájom odlišné. Teraz môžeme pre každú korytnačku zmeniť udalosť priĽavomDolu a zastaviť práve jej 2 procesy:
nechTvar :chytena zastav "k1h zastav "k1o 

Podobne pre k2.

Ani v tomto prístupe sme sa však zatiaľ nevyhli tomu, že kažej korytnačke musíme po skopírovaní cez schránku meniť jej udalosť priĽavomDolu. Skúsenejší programátori však už tušia, že keď vhodne zvolíme mená procesov – zrejme v závislosti od mena samotnej korytnačky, nebudeme musieť modifikovať udalosť novej korytnačky.

Upravme teda procedúru nováHra tak, aby spustila toľko procesov, koľko je na stránke korytnačiek a vhodne ich pomenovala:
viem nováHra
 zmeňTvarMyši :mucholapka
 odteraz všetky
 nechTvar :mucha
 každá
  [(každých 60 [do 2] slovo kto "h)
   (každých 800 [vp ?] slovo kto "o)]
koniec

Vysvetlime si príkazy:

  • tvar myši sme zmenili podľa premennej mucholapka
  • oslovili všetky korytnačky pomocou základného príkazu odteraz
  • všetky korytnačky si zmenili tvar na ten, ktorý je v premennej mucha
  • príkaz každá prechádza postupne všetkými oslovenými korytnačkami (v našom prípade naozaj všetkými) a spúšťa pre ne procesy hýbania a otáčania, ktoré zároveň aj pomenuje a to zložením slova-mena korytnačky, ktoré výsledkom operácie kto a písmena "h a "o.

Zrušme korytnačku k2.

Pre k1 opravme udalosť priĽavomDolu:
nechTvar :chytena zastav slovo mojeMeno "h zastav slovo mojeMeno "o

Príkaz najprv zmení tvar korytnačke a potom zastaví oba procesy, ktoré boli pre ňu spustené – názvy procesov vytvorí opäť zložením jej mena a písmena "h a "o do jedného slova.

Teraz, keď nakopírujeme cez schránku korytnačku k1 a vytvoríme na stránke ľubovoľný počet korytnačiek tlačidlo t1 pre ne spustí a pomenuje procesy a každá z nich bude zastavovať iba dva svoje procesy, ktoré ju hýbali a otáčali.