1. díl - SDL - Úvod a instalace

C++ SDL SDL - Úvod a instalace

V tomto seriálu se podíváme na multiplatformní knihovnu SDL (Simple Directmedia Layer), která se nejčastěji využívá ke tvorbě her. Knihovna poskytuje nízkoúrovňový přístup ke vstupně-výstupním zařízením včetně 2D a 3D grafiky. 3D grafika je v SDL řešena voláním OpenGL funkcí. V tomto seriálu se zaměříme pouze na 2D grafiku. Knihovna dokáže pracovat jak nad OpenGL, tak i nad DirectX při stejné syntaxi. Knihovna samotná obsahuje pouze základní funkcionalitu, zbytek najdeme v přídavných knihovnách (SDL_image, SDL_net, SDL_Sound). Více na Wikipedii nebo stránkách knihovny.

SDL je knihovna vytvořena pro C, nevyužívá tedy třídy ale pouze struktury a globální funkce. Z tohoto důvodu později sáhneme po wrapperu pro C++. Díky tomu budeme moci využít objektově orientovaného programování a typové kontroly, která pro binding například pro C# není možná (kvůli problémům s ukazateli). Řešením by bylo využít objektový wrapper pro binding, ale to už situaci poněkud komplikujeme.

Cílem seriálu bude vytvořit jednoduchou RPG hru, kterou budeme postupně rozšiřovat. Ze začátku se podíváme na základy (práce s okny, vykreslování) a poté na samotnou hru. Jak budeme postupovat, bude se projekt několikrát předělávat. Upozorňuji, že je to z důvodů studijních. Při práci na skutečné aplikaci by se architektura měla měnit co nejméně.

Cílem ovšem není naučit programování v C++. V textu budu předpokládat znalost základních konstrukcí C++ (včetně aritmetiky s ukazateli), objektově orientovaného programování a v dalších dílech i znalost STL - standardní šablonové knihovny (Standart Template Library). Tutoriál pro základní konstrukce můžete nalézt zde, pokročilejší konstrukce jako jsou ukazatele zde. O objektově orientovaném programováním se pojednává zde.

Ukázky budou ve Visual Studiu 2013, stejně tak instalace bude ukázána jen pro Visual Studio 2013. U každého dílu budou zdrojové kódy, ze kterých se bude vycházet v díle dalším. Ve Visual Studiu 2015 stejný postup použít nelze, protože linker nemůže najít některé funkce. Řešením je zkompilovat si knihovnu ze zdrojových kódů ve Visual Studiu 2015.

Instalace

Nejprve si stáhneme zdrojové kódy ze stránek SDL. Zvolíme verzi pro Visual Studio.

Odkaz ke stažení

Nyní vytvoříme prázdný projekt File – New – Project – Installed – Templates – Visual C++ - General – Empty Project. Zdrojové kódy poté extrahujeme do složky projektu.

Dále potřebujeme přidat cesty k těmto souborům, abychom je mohli includovat. Pravým tlačítkem myši klikneme na projekt a zvolíme Properties (nebo Alt+Enter). V levém horním rohu zvolíme konfiguraci. Doporučuji nastavit „*All Configurations*“, není nutné poté nastavovat pro Debug a Release zvlášť. V menu Configuration Properties – VC++ Directories přidáme složky, ve kterých jsou zdrojové kódy. Do „*Include Directories*“ dopíšeme složku /include, která se nachází ve stažených souborech. Dále do „*Library Directories*“ zapíšeme složku /lib/x64 (nebo x86, podle vašich preferencí). Doporučuji používat předdefinovaná makra.

Přidání složek

Nyní bude ještě potřeba přilinkovat SDL knihovny. Opět přejdeme do Configuration Properties – Linker – Input a do „*Additional Dependencies*“ dopíšeme „SDL2.lib“ a „SDL2main.lib“.

Protože jsme zvolili 64-bitové knihovny, musíme i architekturu projektu změnit na x64. Tentokrát rozklikneme Properties celého řešení a v pravém horním rohu klikneme na „*Configuration Manager*“. U projektu vybereme sloupeček Platform a dáme <New…>. Jako novou platformu zvolíme x64. Stejnou operaci opakujeme i pro Release (změna v levém horním rohu). Tyto kroky nejsou nutné pro x86 platformu.

Zvolení platformy

Poslední věc, kterou musíme nastavit, je SubSystem. Opět nastavíme v Properties projektu – Configuration Properties – Linker – Systém – SybSystem. Máme tři možnosti:

  • Console – Použijeme, pokud budeme chtít mít vedle oken otevřenou i konzoli,
  • Windows – Použijeme, pokud budeme chtít pracovat pouze s okny. Defaultní vstup a výstup bude probíhat do souborů,
  • Native – Použijeme, pokud budeme tvořit knihovnu nebo engine.

My zvolíme Windows. Tady se trochu liší konvence. Pokud použijeme Console, vstupem do programu bude funkce int main(), ve které se musí zavolat funkce SDL_SetMainRe­ady(). Pokud použijeme Windows, vstupní funkce bude int SDL_main(int,char**), ale SDL_SetMainReady už není potřeba volat, protože se volá automaticky. Pokud použijeme Native, vstupní funkce přirozeně není, ale před prací s SDL se musí stále zavolat funkce SDL_SetMainReady. Vybereme možnost Windows a potvrdíme. Pokud chcete mít k dispozici konzoli, nastavte Console a nezapomeňte zavolat SDL_SetMainReady.

SubSystem

První program

V prvním programu pouze vyzkoušíme, jestli vše funguje, jak má, a zda je možné program zkompilovat. Následující část kódu by neměla vyvolat žádný error.

#include <SDL.h>
int SDL_main(int,char**)        //int main() pokud jste použili SubSystem Console
{
        // SDL_SetMainReady();   // pokud jste použili SubSystem Console
        SDL_CreateWindow("Test",0,0,800,600,0);
        return 0;
}

Aby mohlo SDL fungovat, potřebuje připojit svou dynamickou knihovnu (SDL2.dll). Protože budeme mít v pozdějších fázích projektu obsahu více, upravíme si projekt tak, aby automaticky kopíroval obsah do výstupní složky. Bohužel však projekt pro C++ nefunguje stejně jako projekty pro C#, kde můžeme jednoduše nastavit, zda se má obsah kopírovat. Vytvoříme ve složce projektu složku Output, do které budeme dávat všechny soubory, které budeme chtít nakopírovat do výstupní složky. Prozatím tam zkopírujeme pouze SDL2.dll. Nyní opět upravíme vlastnosti projektu Configration Preporties – Build Events – pre-Build Event – Command Line. Zde nastavíme příkaz, který by se standardně vykonal na příkazové řádce. Automaticky budeme kopírovat složku Output do výstupní složky příkazem xcopy “$(ProjectDir)Output” “$(TargetDir)” /e /I /f /y. Tím máme hotovo a můžeme projekt spustit.

Automatické kopírování

Jediná věc, kterou program udělá je, že otevře a ihned zavře okno v levém horním rohu obrazovky (mělo by pouze probliknout). Pokud máte s projektem problémy, můžete se obrátit na pomoc zde v komentářích nebo na fóru. Na konci článku přikládám fungující projekt.

V příštím díle vytvoříme nezavírající se okno :-) a podíváme se na zpracování vstupních událostí.


 

Stáhnout

Staženo 380x (3.34 MB)

 

  Aktivity (1)

Článek pro vás napsal patrik.valkovic
Avatar
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu.

Jak se ti líbí článek?
Celkem (6 hlasů) :
4.833334.833334.833334.833334.83333


 


Miniatura
Všechny články v sekci
SDL

 

 

Komentáře
Zobrazit starší komentáře (2)

Avatar
tetriarch29
Člen
Avatar
tetriarch29:

To je paráda, že česká komunita má konečně decentně napsaný článek o SDL.. Dost mi to tu chybělo. Sice už jsem zvyklý hledat vše v angličtině, tak mě přesto tohle umí potěšit. Každopádně by bylo fajn (si myslím) přidat i tutorial jak nastavit SDL i pro jiná IDE než Visual Studio. Například Code::Blocks, velmi vhodně podporuje GCC kompilátor... Ale neni to výtka, jen mi přijde, že by to bylo fajn. Ať tak či onak super práce a jen tak dál ;)

 
Odpovědět 3.9.2015 14:53
Avatar
Jozef
Člen
Avatar
Jozef:

Zdravím, neviem to rozchodiť vo VS 2015... skúšal som skompilovať priložený súbor, ale aj tam mi vyhadzuje chyby:

Error   LNK2019 unresolved external symbol __imp_fprintf referenced in function ShowError
Error   LNK2019 unresolved external symbol __imp___iob_func referenced in function ShowError

Čo treba upraviť, aby to fungovalo aj vo VS 2015?

Odpovědět 5.9.2015 16:46
I'm not afraid to die on a treadmill
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Jozef
patrik.valkovic:

Je to tam napsané. Ve VS 2015 se hodně změnil kompilátor, je potřeba si celé SDL zkompilovat ve Visual Studiu 2015. Tady narazíš na nový problém, a to že poslední verze DirectX je 2010. Od Windows 8 je DIrectX přepracovaný a obsažený ve Windows SDK. S tím ovšem SDL nepočítá, a tak stále hledá soubory, které už neexistují. Můžeš si stáhnout zdrojové kódy SDL a s pár úpravami překompilovat. Vyplivně ti to klasickou .lib a .dll knihovnu.
Eventuelně můžeš použít můj (chystaný) projekt pro pokračování SDL, kde jsem už SDL překompiloval pod VS 2015. Zatím tam jsou prázdné projekty, takže můžeš vesele zkoušet (obsahuje všechny knihovny - SDL, SDL_ttf, SDL_image, SDL_mixer a wrapper).
https://github.com/…ree/v0.0.0.1

Odpovědět  +2 5.9.2015 17:03
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Jozef
patrik.valkovic:

A nebo projekt nechej ve verzi pro VS 2013.

Odpovědět 5.9.2015 17:07
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Jozef
Člen
Avatar
Odpovídá na patrik.valkovic
Jozef:

Skopíroval som si SDL, ktoré si už prekompiloval do svojho projektu, takže to už funguje :)

Odpovědět 5.9.2015 17:49
I'm not afraid to die on a treadmill
Avatar
Jakub Horák
Člen
Avatar
Jakub Horák:

Ahoj, mám takový problém...

když zkompiluju ten první program, tak mi Visual Studio 2013 hlásí dva errory
Error 1 error LNK2001: unresolved external symbol WinMain E:\SDL\Test\MSVCRT­.lib(crtexew.ob­j) Test
Error 2 error LNK1120: 1 unresolved externals E:\SDL\x64\Re­lease\Test.exe Test

nevíte někdo co to je a jak to mám vyřešit?

(všechno jsem nastavil přesně podle tohoto návodu)

 
Odpovědět 1.12.2015 20:46
Avatar
Jakub Horák
Člen
Avatar
Odpovídá na Jakub Horák
Jakub Horák:

Super, tak to už jsem vyřešil (asi tam bylo něco blbě nastaveno, protože když jsem to udělal znova, tak to šlo)

 
Odpovědět 1.12.2015 21:09
Avatar
doMík
Člen
Avatar
doMík:

Mohl by mi někdo trošku poradit jak na inport SDL v code::block? Stáhl jsem verzi SDL pro MinGW, ale nějak se mi to nedaří rozchodit

 
Odpovědět 16. dubna 22:20
Avatar
patrik.valkovic
Šéfredaktor
Avatar
patrik.valkovic:

Code::block neznám, ale chvíli jsem používal Dev-C++, které by snad mělo být na code::block. Někde tam šli knihovny nainstalovat (Myslim že Tools - Package manager). Potom je ještě potřeba přidat knihovny SDL ke kompilaci.

Odpovědět 16. dubna 22:28
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
doMík
Člen
Avatar
doMík:

Konečně vyřešeno :D , dík za odpověď :)

 
Odpovědět 18. dubna 15:32
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 12. Zobrazit vše