Ve třetím článku věnovaném programovacím jazykům a taktéž knihovnám, které mohou být vhodné pro výuku programování i základů počítačové grafiky, si na několika demonstračních příkladech ukážeme použití knihovny LÖVE, o níž jsme se stručně zmínili minule. V případě knihovny LÖVE se zaměříme na její nové verze 0.8.0 a taktéž 0.9.0. Programové rozhraní se totiž oproti starším verzím pozměnilo.
Obsah
1. Programovací jazyky a knihovny určené pro výuku základů počítačové grafiky (3)
2. Nativní knihovny využívané knihovnou LÖVE
3. Moduly, které jsou použity v současných verzích systému LÖVE
4. Základy práce s 2D grafikou
5. První demonstrační příklad: ukázka základní vykreslovací funkce: love.graphics.line()
6. Druhý demonstrační příklad: nastavení barvy vykreslování a vykreslení vyplněných obdélníků
8. Třetí demonstrační příklad: naprogramování reakce na stisk klávesy [Esc]
10. Čtvrtý demonstrační příklad: reakce na stisk tlačítka myši
11. Základy práce s rastrovými obrázky
12. Pátý demonstrační příklad: načtení obrázku ze souboru, zobrazení obrázku
13. Další funkce pro 2D grafiku
14. Zdrojové kódy dnešních demonstračních příkladů
1. Programovací jazyky a knihovny určené pro výuku základů počítačové grafiky (3)
O knihovně LÖVE jsme se již zmínili ve druhé části článku o programovacích jazycích a knihovnách určených pro výuku programování i pro seznámení se s počítačovou grafikou. Připomeňme si tedy, že LÖVE je knihovna určená pro jednoduchou a především rychlou tvorbu her s 2D grafikou, hudbou a zvuky, které jsou naskriptované v programovacím jazyku Lua. Velkou předností systému LÖVE je jeho snadná použitelnost, spočívající zejména v přehledném aplikačním programovém rozhraní (API) jednotlivých knihoven přítomných v tomto systému, použití callback funkcí volaných při vzniku událostí i v jednoduchém a snadno použitelném jazyku Lua a jeho dynamickém typovém systému. Poněkud problematická může být zpětná nekompatibilita se staršími verzemi systému LÖVE, což může vadit zejména studentům hledajícím inspiraci a rady na Internetu (vždy je nutné zjistit, zda nedošlo k přejmenování funkcí, ke změně jejich parametrů atd.). Ostatně s touto nekompatibilitou se setkáme i v dnes popisovaných demonstračních příkladech, které jsou upraveny jak pro stále ještě (pravděpodobně) nejrozšířenější verzi 0.8.0, tak i pro verzi 0.9.0.
Obrázek 1: Tato animace je zobrazena ve chvíli, kdy se LÖVE (verze 0.8.2) spustí bez specifikace aplikace, která se má interpretovat.
2. Nativní knihovny využívané knihovnou LÖVE
Samotný systém LÖVE interně využívá (volá) několik knihoven naprogramovaných v jazycích C a C++, především pak knihovny boost (obecné algoritmy v C++), SDL (nastavení grafických režimů, čtení stavu klávesnice, myši či joysticku), SDL_mixer (podpora hudby a zvuků), OpenGL (2D grafika, double buffering), DevIL (práce s rastrovými obrázky) a FreeType 2 (vykreslování písma). Důležité však je, že vývojář, který s využitím systému LÖVE vytváří hry či jiné interaktivní aplikace s 2D grafikou, hudbou a zvuky, je od těchto knihoven zcela odstíněn jednoduše použitelným aplikačním programovým rozhraním systému LÖVE. Celý systém LÖVE je rozdělen do několika modulů (knihoven), jejichž jména vždy začínají prefixem love., například love.joystick, love.graphics či love.system. Nejedná se samozřejmě o nic jiného, než o jmenný prostor (namespace) implementovaný takovým způsobem, že jsou všechny knihovny uloženy v globálním asociativním poli pojmenovaném love). Tyto moduly je možné do značné míry používat nezávisle na sobě a většina aplikací vlastně s velkou pravděpodobností ani možnosti všech modulů v praxi nevyužije.
Například pro ty typy aplikací, které pouze vyžadují základní práci s grafikou, tj. načítání a úpravu rastrových obrázků, vykreslování základních rovinných útvarů (úseček, polyčar, kružnic, oblouků, vyplněných obdélníků, textu atd.), vytvoření okna či přepnutí grafického režimu (to v případě použití celoobrazovkového režimu – fullscreen mode) a další podobné operace, postačuje použít jen knihovnu love.graphics popř. love.window; pro programy s animacemi se navíc využívá knihovna love.timer a při požadavcích na interaktivitu (tj. reakcí aplikace na operace prováděné uživatelem pomocí klávesnice, myši, touchpadu, joysticku či jiného vstupního zařízení) má programátor na výběr funkce umístěné v knihovnách love.mouse, love.keyboard a love.joystick atd. Navíc existují i moduly od „třetích stran“; v současnosti se jedná především o modul zajišťující komunikaci po síti, čehož je možné využít při tvorbě her pro větší množství hráčů.
Obrázek 2: Tato animace je zobrazena ve chvíli, kdy se LÖVE (nyní verze 0.9.0) spustí bez specifikace aplikace, která se má interpretovat.
3. Moduly, které jsou použity v současných verzích systému LÖVE
V následující tabulce jsou vypsány všechny moduly, které jsou v současných verzích systému LÖVE (verze 0.8.0 a 0.9.0) programátorům nabízeny:
# | Název modulu | Dostupný od verze | Nabízené funkce |
---|---|---|---|
1 | love.audio | základní práce s hudbou a zvuky, spuštění, pozastavení a zastavení přehrávání, nastavení počtu zvukových kanálů, načítání hudby ze souborů typu WAV, AIFF, MP3, OGG, MIDI, MOD, XM i dalších formátů používaných hudebními trackery | |
2 | love.event | práce se systémem událostí | |
3 | love.filesystem | načítání a ukládání souborů uložených v adresáři (adresářích) hry; přístup k těmto souborům je tedy jednodušší, než při použití standardního modulu (knihovny) io; hra navíc může být distribuována v jediném archivu | |
4 | love.font | 0.7.0 | práce s fonty, použití fontů při vykreslování |
5 | love.graphics | povolení či zákaz antialiasingu, vykreslování rastrových obrázků i základních geometrických tvarů, využití částicových systémů | |
6 | love.image | podpora pro práci s rastrovými obrázky různých typů | |
7 | love.joystick | podpora pro různé typy joysticků či podobných vstupních zařízeních (více na sobě nezávislých os, tlačítek a dalších ovládacích prvků) | |
8 | love.keyboard | práce s klávesnicí – zjištění, zda je nějaká klávesa stlačena či nikoli (tato „knihovna“ ve skutečnosti původně obsahovala pouze jednu funkci, která například rozlišuje mezi pravým a levým Shiftem, numerický blok klávesnice atd.) | |
9 | love.math | 0.9.0 | novinka, podpora pro výpočet Bézierových křivek, generátor pseudonáhodných čísel atd. (tedy funkce použitelné ve hrách) |
10 | love.mouse | práce s myší – nastavení viditelnosti a pozice kurzoru, programový posun kurzoru na zadané souřadnice, zjištění aktuální pozice kurzoru myši | |
11 | love.physics | řešení kolizí a popř. i vzájemných odrazů konvexních rovinných útvarů, seskupování těchto útvarů do těles (anglicky body) | |
12 | love.sound | ovládaní zvukového subsystému | |
13 | love.system | 0.9.0 | získání základních informací o systému LÖVE a taktéž o použité platformě (Windows, Linux atd.) |
14 | love.thread | 0.7.0 | podpora pro práci s vlákny nezávisle na použitém operačním systému |
15 | love.timer | na operačním systému nezávislý časovač s rozlišením jedné milisekundy, podpora pro získání počtu snímků vykreslených za sekundu (FPS – frames per second) | |
16 | love.window | 0.9.0 | novinka, práce s okny, nastavení celoobrazovkového režimu |
Problematická je především existence nového modulu nazvaného love.window, do něhož byly ve verzi 0.9.0 přesunuty některé funkce původně používané v modulu love.graphics. Proč tento přesun způsobuje problémy, uvidíme na demonstračních příkladech popsaných níže.
Obrázek 3: Ukázka hry naprogramované s využitím knihovny LÖVE.
4. Základy práce s 2D grafikou
Knihovna LÖVE obsahuje mj. i modul nazvaný love.graphics (viz též http://love2d.org/wiki/love.graphics), v němž se nachází většina funkcí používaných pro práci s 2D grafikou. Pouze některé funkce byly v nejnovější verzi této knihovny přesunuty do modulu love.window; jedná se především o funkce používané pro přepnutí do celoobrazovkového režimu, nastavení rozlišení obrazovky, nastavení velikosti okna (pokud není použit výše zmíněný celoobrazovkový režim) atd. Mezi základní funkce používané v 2D grafice patří vykreslování základních geometrických tvarů (úsečka, polyčára, kružnice, oblouk, vyplněné tvary), práce s písmy (zde je využita knihovna FreeType 2) a v neposlední řadě taktéž vykreslování rastrových obrázků, které mohou být načteny z externích souborů (o práci s grafickými formáty se interně stará knihovna DevIL a zlib).
Pozor: i v tomto modulu můžeme narazit na změnu jmen či na změnu významu funkcí. Například dříve se pro vykreslení textu používala funkce love.graphics.draw(), zatímco dnes je nutné použít funkci love.graphics.print() či love.graphics.printf().
Obrázek 4: Prohlížeč demonstračních příkladů.
5. První demonstrační příklad: ukázka základní vykreslovací funkce: love.graphics.line()
Podívejme se nyní na první demonstrační příklad, v němž se ukáže jak jednoduchost tvorby aplikací s využitím systému LÖVE, tak i některé základní koncepty, na nichž je tato knihovna postavena. Povšimněte si, že je celý příklad tvořen jen jedinou funkcí pojmenovanou love.draw(). Jméno této funkce nebylo zvoleno náhodně, protože love.draw() (samozřejmě jen v případě, pokud existuje – je deklarována) je volána automaticky v okamžiku, kdy je zapotřebí překreslit okno nebo celou obrazovku. V této funkci se nejprve zjistí rozměry automaticky vytvořeného okna s využitím funkcí love.graphics.getWidth() a love.graphics.getHeight() a posléze se v programové smyčce vykreslí obrazec tvořený úsečkami. Pro kresbu úseček je možné použít funkci nazvanou love.graphics.line(), které se buď předají koncové body jediné úsečky (čtyři numerické hodnoty), nebo řídicí body polyčáry (lomené čáry). Opět zde můžeme vidět snadnost použití této knihovny – programátor si nemusí pamatovat funkci pro kreslení úseček a jinou funkci pro kreslení polyčar:
-- -- Knihovna LÖVE -- -- První demonstrační příklad -- -- Ukázka základní vykreslovací funkce: love.graphics.line() -- -- -- Tato funkce je volána automaticky při překreslení obsahu -- okna či obrazovky. -- function love.draw() -- velikost okna local width = love.graphics.getWidth() local height = love.graphics.getHeight() -- zobrazeni několika úseček for offset = 20, height/2-5, 20 do -- jediné volání této funkce může vést k vykreslení -- většího množství úseček love.graphics.line(offset, offset, width-offset, offset, width-offset, height-offset, offset, height-offset, offset, offset) end end -- -- finito --
Jakým způsobem je možné tento program spustit? Celý zdrojový kód by měl být umístěn do souboru nazvaného main.lua, který je uložen v samostatném adresáři pojmenovaném stejně, jako spouštěná aplikace, například love-example-1. Aplikace se v tomto případě spustí z nadřazeného adresáře následovně:
love love-example-1
Obrázek 5: Screenshot prvního demonstračního příkladu.
6. Druhý demonstrační příklad: nastavení barvy vykreslování a vykreslení vyplněných obdélníků
Ve druhém demonstračním příkladu je ukázán způsob změny vnitřního stavu modulu love.graphics. S využitím funkce love.graphics.setColor() je změněna barva použitá pro vyplnění obdélníků (či čtverců) vykreslených funkcí love.graphics.rectangle(). Funkce love.graphics.setColor() se používá velmi jednoduše – předávají se jí tři numerické hodnoty představující trojici barvových složek barvového modelu RGB (Red, Green, Blue), přičemž každá složka může nabývat hodnot 0 až 255. Alternativně je možné tuto funkci volat se čtyřmi hodnotami; v tomto případě je čtvrtá hodnota považována za průhlednost (Alpha), jejíž význam se liší v závislosti na použitém režimu míchání barev (viz též následující kapitoly). Existuje ještě jeden způsob volání této funkce – lze jí předat tabulku obsahující tři nebo čtyři numerické hodnoty se stejným význame (Red, Green, Blue a nepovinná Alpha). Druhá funkce love.graphics.rectangle() slouží pro vykreslení čtverců či obdélníků. Zajímavé je, že v prvním parametru je možné řetězcem "line" či "fill" určit režim vykreslování:
-- -- Knihovna LÖVE -- -- Druhý demonstrační příklad -- -- Nastavení barvy vykreslování a vykreslení vyplněných obdélníků. -- -- -- Tato funkce je volána automaticky při překreslení obsahu -- okna či obrazovky. -- function love.draw() -- velikost okna local width = love.graphics.getWidth() local height = love.graphics.getHeight() -- vykreslení matice obdélníků for j = 0,15 do for i = 0,15 do -- nastavení barvy vykreslování love.graphics.setColor(j*16, i*16, i*8+j*8) local x = 50 + i*30 local y = 50 + j*30 -- vykreslení vyplněného obdélníku love.graphics.rectangle("fill", x, y, 30, 30) end end end -- -- finito --
Obrázek 6: Screenshot druhého demonstračního příkladu.
7. Čtení stavu klávesnice
Pro čtení stavu stlačených kláves, ovládání myši a joysticků lze použít moduly nazvané love.keyboard, love.mouse a love.joystick. Modul love.keyboard obsahuje důležitou funkci love.keyboard.isDown(), pomocí níž lze zjistit, která klávesa či klávesy jsou v daném okamžiku stisknuty. Jedná se o práci s klávesnicí na nejnižší úrovni, tj. lze například rozeznat stavy přeřaďovačů (Shift, Alt, Ctrl), odlišit numerický blok klávesnice od kurzorového bloku i numerických kláves umístěných v alfanumerickém bloku atd. Tuto funkci je možné použít i v případě, že je současně stlačeno větší množství kláves a klávesnice tuto kombinaci rozezná, což však nemusí být – vzhledem k architektuře PC klávesnic – vždy splněno. Alternativní způsob čtení stavu klávesnice spočívá ve využití callback funkcí nazvaných keypressed() a keyreleased(), které jsou automaticky zavolány vždy při stisku či naopak uvolnění klávesy.
8. Třetí demonstrační příklad: naprogramování reakce na stisk klávesy [Esc]
Ve třetím demonstračním příkladu je použita callback funkce love.keypressed(), která je zavolána ve chvíli, kdy je stisknuta libovolná klávesa. V jediném parametru této funkce je předán kód stlačené klávesy, a to ve velmi snadno zpracovatelné podobě: například stisk klávesy [Esc] je představován řetězcovou konstantou „escape“. Nejedná se sice o nejefektivnější způsob reprezentace kódů stlačených kláves, ovšem na druhou stranu čitelnost a snadnost použití knihovny LÖVE zde dostala přednost:
-- -- Knihovna LÖVE -- -- Třetí demonstrační příklad -- -- Nastavení barvy vykreslování a vykreslení vyplněných obdélníků. -- Naprogramování reakce na stisk klávesy [Esc]. -- -- -- Tato funkce je volána automaticky při překreslení obsahu -- okna či obrazovky. -- function love.draw() -- velikost okna local width = love.graphics.getWidth() local height = love.graphics.getHeight() -- vykreslení matice obdélníků for j = 0,15 do for i = 0,15 do -- nastavení barvy vykreslování love.graphics.setColor(j*16, i*8+j*8, i*16) local x = 50 + i*30 local y = 50 + j*30 -- vykreslení vyplněného obdélníku love.graphics.rectangle("fill", x, y, 29, 29) end end end -- -- Callback funkce zavolaná při stisku klávesy. -- function love.keypressed(k) if k == 'escape' then love.event.quit() end end -- -- finito --
Obrázek 7: Screenshot třetího demonstračního příkladu.
9. Základy práce s myší
Pro ovládání myši i pro zjištění aktuální pozice kurzoru a stavu všech tlačítek myši lze využít modul nazvaný love.mouse, jenž obsahuje funkci love.mouse.setVisible() pro skrytí či naopak zviditelnění kurzoru myši, funkce love.mouse.getX(), love.mouse.getY() a love.mouse.getPosition() pro přečtení aktuálních souřadnic kurzoru, funkci love.mouse.isDown() pro zjištění, které tlačítko či tlačítka myši jsou v daném okamžiku stlačena a konečně funkci love.mouse.setPosition() pomocí níž lze změnit souřadnice kurzoru myši a tím i pozici kurzoru na obrazovce. Kromě výše zmíněných funkcí je možné vytvořit dvě uživatelské callback funkce nazvané mousepressed() a mousereleased(). Tyto funkce jsou systémem automaticky zavolány v případě, že je stisknuto či naopak uvolněno některé tlačítko myši. Vždy jsou naplněny tři parametry – aktuální x-ová souřadnice kurzoru myši, y-ová souřadnice a řetězcová konstanta "l", "r", "m" podle toho, které tlačítko myši je stisknuto či uvolněno.
10. Čtvrtý demonstrační příklad: reakce na stisk tlačítka myši
Ve čtvrtém příkladu je použita callback funkce nazvaná love.mousepressed(). Tato funkce je využita pro naprogramování reakce na stisk (levého) tlačítka myši v pracovním okně. Ve chvíli, kdy dojde k detekci stisku tlačítka, uloží se do proměnných selX a selY pozice kurzoru myši, která je následně využita při překreslení obsahu okna ve funkci love.draw pro překreslení jednoho čtverce (na němž se nachází kurzor) odlišnou barvou:
-- -- Knihovna LÖVE -- -- Čtvrtý demonstrační příklad -- -- Naprogramování dalších reakcí na události. -- local border = 50 local rectangleOffset = 30 local rectangleSize = 29 local selX = nil local selY = nil -- -- Funkce volaná při inicializaci aplikace. -- function love.load() love.graphics.setColor(0,0,0) love.graphics.setBackgroundColor(255,255,255) end -- -- Tato funkce je volána automaticky při překreslení obsahu -- okna či obrazovky. -- function love.draw() -- velikost okna local width = love.graphics.getWidth() local height = love.graphics.getHeight() -- vykreslení matice obdélníků for j = 0,15 do for i = 0,15 do -- nastavení barvy vykreslování love.graphics.setColor(j*16, i*8+j*8, i*16) local x = border + i*rectangleOffset local y = border + j*rectangleOffset -- vykreslení vyplněného obdélníku love.graphics.rectangle("fill", x, y, rectangleSize, rectangleSize) end end if selX and selY then -- nastavení barvy vykreslování love.graphics.setColor(255-selY*16, selX*8+selY*8, 255-selX*16) -- vykreslení vyplněného obdélníku love.graphics.rectangle("fill", selX, selY, rectangleSize, rectangleSize) end end -- -- Callback funkce zavolaná při stisku tlačítka myši. -- function love.mousepressed(x, y, button) if button == 'l' then if x > border and x < border + rectangleOffset*16 and y > border and y < border+rectangleOffset*16 then selX = x - ((x-border) % rectangleOffset) selY = y - ((y-border) % rectangleOffset) end end end -- -- Callback funkce zavolaná při stisku klávesy. -- function love.keypressed(k) if k == 'escape' then love.event.quit() end end -- -- finito --
Obrázek 8: Screenshot čtvrtého demonstračního příkladu.
Obrázek 9: Výběr odlišného čtverce.
11. Základy práce s rastrovými obrázky
Základem při práci s rastrovými obrázky je funkce nazvaná love.graphics.newImage() sloužící pro načtení obrázku ze souboru, který musí být dodán společně s kódem hry či jiné aplikace. Postačuje, aby obrázek byl uložen ve stejném adresáři popř. v podadresáři (relativně vůči souboru main.lua). Ve většině her se používají obrázky uložené ve formátu PNG či JPG (JPEG), existuje však podpora i pro další souborové formáty. Důležité je si uvědomit, že po načtení obrázku získáme objekt typu Image, který programátorům nabízí poměrně velké množství užitečných metod sloužících jak pro zjištění rozměrů obrázku, tak i pro jeho fitraci atd.
12. Pátý demonstrační příklad: základy práce s rastrovými obrázky
Podívejme se nyní na zdrojový kód demonstračního příkladu, v němž se v callback funkci love.load() zavolané v době inicializace aplikace načte rastrový obrázek nazvaný „gnome-globe.png“. Tento obrázek je následně vykreslen s využitím funkce love.graphics.draw(). Povšimněte si způsobu, jakým je zajištěno, aby byl obrázek vykreslen přesně ve středu okna (do funkce love.graphics.draw() se totiž předávají souřadnice levého horního rohu obrázku):
-- -- Knihovna LÖVE -- -- Pátý demonstrační příklad -- -- Načtení obrázku ze souboru, zobrazení obrázku. -- -- -- Funkce volaná při inicializaci aplikace. -- function love.load() image = love.graphics.newImage("gnome-globe.png") end -- -- Tato funkce je volána automaticky při překreslení obsahu -- okna či obrazovky. -- function love.draw() -- velikost okna local windowWidth = love.graphics.getWidth() local windowHeight = love.graphics.getHeight() -- velikost bitmapy local imageWidth = image:getWidth() local imageHeight = image:getHeight() -- výpočet umístění bitmapy local x = windowWidth/2 - imageWidth/2 local y = windowHeight/2 - imageHeight/2 -- zobrazení bitmapy love.graphics.draw(image, x, y) end -- -- Callback funkce zavolaná při stisku klávesy. -- function love.keypressed(k) if k == 'escape' then love.event.quit() end end -- -- finito --
Obrázek 10: Screenshot pátého demonstračního příkladu.
13. Další funkce pro 2D grafiku
Před použitím funkcí pro vykreslování je nejprve vhodné buď vytvořit okno se zadanou velikostí, do nějž bude vykreslování prováděno, nebo nastavit celoobrazovkový grafický režim – fullscreen mode – ke kterému bude mít aplikace exkluzivní přístup, což znamená, že se pro celoobrazovkový režim alokuje část video paměti, do které bude mít přístup pouze jedna aplikace a při porušení této paměti systém sám požádá o překreslení celé scény. Okno či celoobrazovkový grafický režim lze nastavit funkcí love.graphics.setMode() (nověji love.window.setMode()), ovšem před voláním této funkce je vhodné pomocí love.graphics.getModes() (nověji love.window.getFullscreenModes()) nebo s využitím love.graphics.checkMode() zjistit, zda je daný grafický režim podporován (například na mnoha počítačích existují poměrně restriktivní omezení pro rozlišení celoobrazovkových režimů). Funkce love.graphics.getModes() vrátí seznam dostupných celoobrazovkových grafických režimů, zatímco funkce love.graphics.checkMode() zjistí, zda je možné použít grafický režim se zadaným rozlišením.
Při vytváření okna nebo přepnutí do celoobrazovkového režimu lze nastavit požadované horizontální a vertikální rozlišení, dále zvolit, zda se má při vykreslování čekat na vertikální synchronizaci (na prastarých 🙂 CRT monitorech se jedná o návrat paprsku do levého horního rohu obrazovky) a taktéž globálně povolit či zakázat antialiasing hran vykreslovaných obrazců (interně se pro nastavení antialiasu využívají funkce grafické knihovny OpenGL, která představuje standardizované aplikační rozhraní ke grafickým akcelerátorům).
14. Zdrojové kódy dnešních demonstračních příkladů
Všech pět demonstračních příkladů, s nimiž jsme se dnes seznámili, bylo uloženo do Git repositáře na GitHubu:
# | Příklad | Zdrojový kód |
---|---|---|
1 | example01 | https://github.com/tisnik/presentations/tree/master/love/example01 |
2 | example02 | https://github.com/tisnik/presentations/tree/master/love/example02 |
3 | example03 | https://github.com/tisnik/presentations/tree/master/love/example03 |
4 | example04 | https://github.com/tisnik/presentations/tree/master/love/example04 |
5 | example05 | https://github.com/tisnik/presentations/tree/master/love/example05 |
Obrázek 11: Některé běhové chyby jsou způsobeny vzájemnou nekompatibilitou jednotlivých verzí knihovny LÖVE a je nutné s nimi počítat a předcházet jim.
15. Odkazy na Internetu
- Domovská stránka systému LÖVE
http://love2d.org/ - Dokumentace k systému LÖVE
http://love2d.org/wiki/love - Domovská stránka programovacího jazyka Lua
http://www.lua.org/ - Seriál o programovacím jazyku Lua (root.cz)
http://www.root.cz/serialy/programovaci-jazyk-lua/ - Domovská stránka systému LÖVE
http://love2d.org/ - Domovská stránka programovacího jazyka Lua
http://www.lua.org/ - Web o Lieru, Gusanos, GeneRally, Atari atd.
http://karelik.wz.cz/ - Web o Lieru, Gusanos
http://karelik.wz.cz/gusanos.php - GUSANOS
http://gusanos.sourceforge.net/ - GUSANOS Download
http://sourceforge.net/projects/gusanos/ - Lua
http://www.linuxexpres.cz/praxe/lua - Lua
http://cs.wikipedia.org/wiki/Lua - Lua (programming language)
http://en.wikipedia.org/wiki/Lua_(programming_language) - The Lua Programming Language
http://www.tiobe.com/index.php/paperinfo/tpci/Lua.html - Lua Programming Gems
http://www.lua.org/gems/ - LuaForge
http://luaforge.net/ - Forge project tree
http://luaforge.net/softwaremap/trove_list.php - SdlBasic home page
http://www.sdlbasic.altervista.org/main/ - SdlBasic examples
http://nitrofurano.linuxkafe.com/sdlbasic/ - SdlBasic na Wikipedii
http://en.wikipedia.org/wiki/SdlBasic - Simple DirectMedia Layer
http://en.wikipedia.org/wiki/Simple_DirectMedia_Layer - SDLBASIC – The high-level interpreter for all?
http://openbytes.wordpress.com/2008/11/08/sdlbasic-the-high-level-interpreter-for-all/ - FreeBasic home page
http://www.freebasic.net/ - FreeBASIC (Wikipedia EN)
https://en.wikipedia.org/wiki/FreeBASIC - FreeBASIC Wiki
http://www.freebasic.net/wiki/wikka.php?wakka=FBWiki - FreeBASIC Manual
http://www.freebasic.net/wiki/wikka.php?wakka=DocToc - FreeBASIC (Wikipedia CZ)
http://cs.wikipedia.org/wiki/FreeBASIC - The Griffon Legend
http://syn9.thingie.net/?table=griffonlegend - Seriál Letní škola programovacího jazyka Logo
http://www.root.cz/serialy/letni-skola-programovaciho-jazyka-logo/ - Scratch: oficiální stránka projektu
http://scratch.mit.edu/ - Scratch: galerie projektů vytvořených ve Scratchi
http://scratch.mit.edu/galleries/browse/newest - Scratch: nápověda
file:///usr/share/scratch/Help/en/index.html - Scratch: obrazovky nápovědy
file:///usr/share/scratch/Help/en/allscreens.html - Scratch (Wikipedie CZ)
http://cs.wikipedia.org/wiki/Scratch - Scratch (programming language)
http://en.wikipedia.org/wiki/Scratch_(programming_language) - Scratch Modification
http://wiki.scratch.mit.edu/wiki/Scratch_Modification - Scratch Lowers Resistance to Programming
http://www.wired.com/gadgetlab/2009/03/scratch-lowers/ - Snap!
http://snap.berkeley.edu/ - Prostředí Snap!
http://snap.berkeley.edu/snapsource/snap.html - Alternatives to Scratch
http://wiki.scratch.mit.edu/wiki/Alternatives_to_Scratch - Basic-256 home page
http://www.basic256.org/index_en - Basic-256 Language Documentation
http://doc.basic256.org/doku.php - Basic-256 Art Gallery
http://www.basic256.org/artgallery - Basic-256 Tutorial
http://www.basic256.org/tutorials - Why BASIC?
http://www.basic256.org/whybasic - A book to teach ANYBODY how to program a computer (using BASIC)
http://www.basicbook.org/ - BASIC Computer Games (published 1978) - Hammurabi
http://atariarchives.org/basicgames/showpage.php?page=78 - Hamurabi - zdrojový kód v BASICu
http://www.dunnington.u-net.com/public/basicgames/HMRABI
12. 8. 2015 at 00:59
Díky za článek
PS: Třetí díl nemá přiřazen štítek „Výuka“ a tak se na seriál nedá odkazovat přes:
http://fedora.cz/stitek/vyuka/
Ať se daří
12. 8. 2015 at 22:01
Přidáno, všechny tři díly mají štítek „Výuka“. Díky ještě jednou za upozornění.
12. 8. 2015 at 12:19
Zdravim a dekuji za upozorneni. Vecer to opravim, to neni problem.