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ů

7. Čtení stavu klávesnice

8. Třetí demonstrační příklad: naprogramování reakce na stisk klávesy [Esc]

9. Základy práce s myší

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ů

15. Odkazy na Internetu

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.

01

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áčů.

02

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.

03

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().

04

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

05

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
--

06

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
-- 

07

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
-- 

08

Obrázek 8: Screenshot čtvrtého demonstračního příkladu.

09

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
-- 

10

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

11

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

  1. Domovská stránka systému LÖVE
    http://love2d.org/
  2. Dokumentace k systému LÖVE
    http://love2d.org/wiki/love
  3. Domovská stránka programovacího jazyka Lua
    http://www.lua.org/
  4. Seriál o programovacím jazyku Lua (root.cz)
    http://www.root.cz/serialy/programovaci-jazyk-lua/
  5. Domovská stránka systému LÖVE
    http://love2d.org/
  6. Domovská stránka programovacího jazyka Lua
    http://www.lua.org/
  7. Web o Lieru, Gusanos, GeneRally, Atari atd.
    http://karelik.wz.cz/
  8. Web o Lieru, Gusanos
    http://karelik.wz.cz/gusanos.php
  9. GUSANOS
    http://gusanos.sourceforge.net/
  10. GUSANOS Download
    http://sourceforge.net/projects/gusanos/
  11. Lua
    http://www.linuxexpres.cz/praxe/lua
  12. Lua
    http://cs.wikipedia.org/wiki/Lua
  13. Lua (programming language)
    http://en.wikipedia.org/wiki/Lua_(programming_language)
  14. The Lua Programming Language
    http://www.tiobe.com/index.php/paperinfo/tpci/Lua.html
  15. Lua Programming Gems
    http://www.lua.org/gems/
  16. LuaForge
    http://luaforge.net/
  17. Forge project tree
    http://luaforge.net/softwaremap/trove_list.php
  18. SdlBasic home page
    http://www.sdlbasic.altervista.org/main/
  19. SdlBasic examples
    http://nitrofurano.linuxkafe.com/sdlbasic/
  20. SdlBasic na Wikipedii
    http://en.wikipedia.org/wiki/SdlBasic
  21. Simple DirectMedia Layer
    http://en.wikipedia.org/wiki/Simple_DirectMedia_Layer
  22. SDLBASIC – The high-level interpreter for all?
    http://openbytes.wordpress.com/2008/11/08/sdlbasic-the-high-level-interpreter-for-all/
  23. FreeBasic home page
    http://www.freebasic.net/
  24. FreeBASIC (Wikipedia EN)
    https://en.wikipedia.org/wiki/FreeBASIC
  25. FreeBASIC Wiki
    http://www.freebasic.net/wiki/wikka.php?wakka=FBWiki
  26. FreeBASIC Manual
    http://www.freebasic.net/wiki/wikka.php?wakka=DocToc
  27. FreeBASIC (Wikipedia CZ)
    http://cs.wikipedia.org/wiki/FreeBASIC
  28. The Griffon Legend
    http://syn9.thingie.net/?table=griffonlegend
  29. Seriál Letní škola programovacího jazyka Logo
    http://www.root.cz/serialy/letni-skola-programovaciho-jazyka-logo/
  30. Scratch: oficiální stránka projektu
    http://scratch.mit.edu/
  31. Scratch: galerie projektů vytvořených ve Scratchi
    http://scratch.mit.edu/galleries/browse/newest
  32. Scratch: nápověda
    file:///usr/share/scratch/Help/en/index.html
  33. Scratch: obrazovky nápovědy
    file:///usr/share/scratch/Help/en/allscreens.html
  34. Scratch (Wikipedie CZ)
    http://cs.wikipedia.org/wiki/Scratch
  35. Scratch (programming language)
    http://en.wikipedia.org/wiki/Scratch_(programming_language)
  36. Scratch Modification
    http://wiki.scratch.mit.edu/wiki/Scratch_Modification
  37. Scratch Lowers Resistance to Programming
    http://www.wired.com/gadgetlab/2009/03/scratch-lowers/
  38. Snap!
    http://snap.berkeley.edu/
  39. Prostředí Snap!
    http://snap.berkeley.edu/snapsource/snap.html
  40. Alternatives to Scratch
    http://wiki.scratch.mit.edu/wiki/Alternatives_to_Scratch
  41. Basic-256 home page
    http://www.basic256.org/index_en
  42. Basic-256 Language Documentation
    http://doc.basic256.org/doku.php
  43. Basic-256 Art Gallery
    http://www.basic256.org/artgallery
  44. Basic-256 Tutorial
    http://www.basic256.org/tutorials
  45. Why BASIC?
    http://www.basic256.org/whybasic
  46. A book to teach ANYBODY how to program a computer (using BASIC)
    http://www.basicbook.org/
  47. BASIC Computer Games (published 1978) - Hammurabi
    http://atariarchives.org/basicgames/showpage.php?page=78
  48. Hamurabi - zdrojový kód v BASICu
    http://www.dunnington.u-net.com/public/basicgames/HMRABI