Něco málo o programu Imagine Logo Imagine a objekty Objektově orientované programování (OOP) se v posledních letech stává velmi populárním. Mnoho začínajících programátorů sní o možnosti naučit se pracovat "objektově". My samozřejmě víme, že tento styl programování je daleko náročnější a pro začátečníka téměř nezvládnutelný. Naproti tomu Imagine nabízí objektový pohled: téměř vše, s čím studenti v Logu pracují - želvy, grafická plocha, tlačítka,... jsou ve skutečnosti objekty, t.j. instance nějakých předdefinovaných tříd se stavovými proměnnými a metodami. Naštěstí je toto celé navrženo tak, aby se objekty daly před žáky či studenty úplně zamlčet a ti se učili podle klasických postupů výuky programování. Objektový pohled mohou studenti postupně objevovat až v pokročilejších etapách učení se a mohou si takto postupně zvykat na jiný styl programátorského myšlení. Protože jazyk Logo je ve své podstatě interpretační jazyk, filozofie objektů má mírné odchylky např. od objektů v Delphi nebo C++: třídy. Instance můžeme dynamicky během běhu programu měnit, doplňovat, můžeme vytvářet instance nejen od tříd, ale také od jiných instancí, můžeme vytvářet klony (klonovat objekty). Díky koncepci chování (behavior) můžeme objektům přiřazovat i chování jiných objektů - říkáme, že kromě statické hierarchie objektů je možno vytvářet i dynamickou hierarchii - Imagine používá vícenásobné dynamické dědění. Imagine a události Koncepce objektů si vynutila jednu zásadnější změnu oproti ComLogu: podobně jako jiná programovací prostředí pod Windows (VB, Delphi, C++Builder apod.) programování je řízeno událostmi. Toto znamená, že nepíšeme nějaký rozsáhlý souvislý program, který se soustřeďuje na řešení všech možných situací, ale píšeme mnoho malých, někdy pouze jednopříkazových podprogramů, které se automaticky vyvolávají při vzniku různých událostí. Např. klepnutí myší, táhnutí, kolize s jiným 1
objektem apod. Pro různé objekty a jejich události definujeme různé podprogramy. Zřejmě se způsob práce s myší a klávesnicí bude oproti ComLogu dost odlišovat. Imagine a paralelismus V jistém smyslu paralelismus vyplývá z toho, že programy jsou řízeny událostmi - tyto události vyvolávají různé podprogramy, které ale běží paralelně. Kromě toho můžeme spouštět další příkazy pomocí různých paralelních konstrukcí, např. pořád, spusť, každých a podobně. Imagine podporuje paralelní nezávislé procesy. Imagine a želvy "Hlavním hrdinou" prostředí Logo je pravděpodobně objekt želva. Kromě toho, že kreslí do grafické plochy nebo se jen po ní pohybuje, může měnit svůj tvar. Želva se může "převlékat" do různých obrázků a jsou tyto obrázky animované (např. animovaný GIF), tak se automaticky v ploše animují. Tyto obrázkové tvary nemusí být želvámm přiřazeny jen ze souborů, ale mohou být nakresleny logovským programem, např. příkazem tvar! [barvapera! červená kruh 50] želva změní tvar na červený kruh. Pro přípravu obrázků, zvláště pro tvary želv, slouží pro Imagine velmi důvtipný bitmapový editor LogoMotion. Ten pomáha vytvářet i efektní animace. Želva kreslí do grafické plochy. Grafická plocha nemusí být na rozdíl od ComLoga jediná, ale programátor může svůj projekt rozdělit na stránky a každá stránka (to je vlastně grafická plocha) může v sobě obsahovat několik menších grafických listů (papír). I v těchto menších listech, které se mohou vzájemně překrývat, se pohybují a kreslí želvy. Imagine nabízí více strategií, podle kterých se chovají objekty - želvy, pokud narazí na okraj své plochy. 2
Videostop Vypracované příklady + vysvětlení příkazů příkaz videostop1 každá [faze! lib] cekej 1000 videostop1 příkaz videostop zrušželvu vše smaž nová "Želva [tvar videostop.lgf poz[-50 0]] nova "zelva [tvar videostop.lgf poz[0 0]] nova "zelva [tvar videostop.lgf poz[50 0]] dosaď "bod 0 odted vsechny videostop1 Vysvětlení příkazů každá [faze! lib] - každá želva bude náhodně měnit fázi (od 1-6) cekej 1000 - každá želva bude čekat před každou změnou 1000ms videostop1 - příkaz spustí znova videostop1 (rekurzivně) zrušželvu vše - zruší všechny existující želvy smaž - smaže obrazovku nová "Želva [tvar videostop.lgf poz[-50 0]] - vytvoří novou želvu s tvarem videostop na pozici [-50 0] dosaď "bod 0 - dosadí do proměnné bod hodnotu 0 odted vsechny videostop1 - odteď budou všechny želvy provádět příkaz videostop 1 3
Změna fází příkaz zmena_fazi smaž zrušželvu vše nová "želva [poz[-350 0] směr 90] nová "želva [poz[-350-100] směr 90] nová "želva [poz[-350 100] směr 90] nová "Želva [tvar videostop.lgf poz[-370 230] fáze lib] nova "želva [tvar videostop.lgf poz[-320 230] fáze lib] nova "želva [tvar videostop.lgf poz[-270 230] fáze lib] každých 30 [odteď [ž1] bp!(nahodně 15) tp!"10 do ž4'fáze cekej 100] každých 30 [odteď [ž2] bp!(nahodně 15) tp!"10 do ž5'fáze cekej 100] každých 30 [odteď [ž3] bp!(nahodně 15) tp!"10 do ž6'fáze cekej 100] Vysvětlení příkazů nová "želva [poz [-350 0] směr 90] - vytvoří novou želvu na pozici se směrem 90 nová "Želva [tvar videostop.lgf poz[-370 230] fáze lib] (vytvoří novou želvu ve tvaru videostop na pozici a nastaví libovolnou fázi) každých 30 [odteď [ž1] bp!(nahodně 15) tp!"10 do ž4'fáze cekej 100] ( každých 30ms želva1 změní náhodně barvu pera, nastaví tloušťku pera na hodnotu 10, posune se dopředu o číslo které bude zrovna na kostce hozeno) Obdobně to je i u dalších želv 4
Animovaná předpověď počasí příkaz pocasi novazelva2 pohyb příkaz poczac zrusobjekt vsechny smaz domů pocasi příkaz novazelva2 novazelva odteď "ž1 tvar! " mapy\česko.lgf zvětšení! 8 odteď "ž2 tvar! " počasí.lgf pn poz! [230-10] záběr! 1 odteď "ž3 tvar! " počasí.lgf pn poz! [-120 25] záběr! 4 odteď "ž4 tvar! " počasí.lgf pn poz! [20 0] záběr! 2 příkaz novazelva smaž zrusobjekt vsechny opakuj 4 [nová "Želva []] příkaz pohyb odteď [ž2 ž3 ž4] opakuj 1000 [každá [zvetsi1 zvetsi2 zm_pohybu]] příkaz zvetsi1 pro "ž2 [poz! [230-10]] zvětšení! zvětšení * 1.5 čekej 100 pro "ž2 [poz! [230-10]] zvětšení! zvětšení / 1.5 čekej 100 příkaz zvetsi2 pro "ž3 [poz! [-125 35]] zvětšení! zvětšení * 1.2 čekej 150 pro "ž3 [poz! [-120 25]] zvětšení! zvětšení / 1.2 čekej 150 příkaz zm_pohybu čekej 200 pro "ž4 [poz! [40 0]] čekej 100 pro "ž4 [poz! [60 0]] čekej 100 pro "ž4 [poz! [80 0]] čekej 100 pro "ž4 [poz! [100 0]] čekej 100 pro "ž4 [poz! [120 0]] čekej 100 5
pro "ž4 [poz! [120 0]] čekej 100 pro "ž4 [poz! [100 0]] čekej 100 pro "ž4 [poz! [80 0]] čekej 100 pro "ž4 [poz! [60 0]] čekej 100 pro "ž4 [poz! [40 0]] čekej 100 pro "ž4 [poz! [20 0]] čekej 100 Vysvětlení příkazů Několik příkazů už bylo vysvětleno v předchozích příkladech, proto zmíníme jen ty, které jsou nové odteď [ž2 ž3 ž4] - od této chvíle platí pro želvy 2,3,4 opakuj 100 [každá [zvetsi1 zvetsi2 zvetsi3]] - bude 100x opakovat zvětšení obrázků pro "ž2 [poz! [230-10]] zvětšení! zvětšení * 1.5 čekej 100 (pro želvu 2 se změní pozice na udané souřadnice, zároveň se zvětší obrázek želvy 1,5x a pak počká 100 ms) Obdobně to bude také u želvy "ž3 s tím rozdílem, že se obrázek bude zvětšovat 1,2x a počká 150 ms U želvy "ž4 se želva nebude zvětšovat, ale bude se pohybovat stále doprava a doleva 6
I-tá želva honí (i + 1) vou želvu příkaz udelej.zelvy :n zrusobjekt vsechny smaz opakuj :n [nová "Želva [.jmeno (poc-1) poz lib]] odted vsechny kazda [bp! nahodne 15] tp! 2 příkaz honicka :n kazda [dosaďzde "a zbytek kdo + 1 :n dosadzde "b kdo pro :a [dosadzde "PozA poz] pro :b [dosadzde "PozB poz] směr! směremk :a Poz! :PozA poz! :pozb do 0.1 * abs poz - pro :a [poz]] cekej 300 honicka :n příkaz start :n udelej.zelvy :n honicka :n Vysvětlení příkazů opakuj :n [nová "Želva [.jmeno (0) poz lib]] vytvoří :N želv na libovolné pozici, pojmenovávat bude od čísla 0 odted všechny od této chvíle začnou všechny aktivní želvy dělat určitý příkaz 7
kazda [bp! nahodne 15] každá želva změní barvu pera náhodně do hodnoty 15 tp!2 nastaví tloušťku pera na hodnotu 2 8