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

C a C++ SDL SDL - Úvod a instalace

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

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 504x (3.34 MB)

 

 

Článek pro vás napsal patrik.valkovic
Avatar
Jak se ti líbí článek?
7 hlasů
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu (NodeJS).
Miniatura
Všechny články v sekci
SDL
Aktivity (1)

 

 

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

Avatar
patrik.valkovic
Šéfredaktor
Avatar
patrik.valkovic:16.4.2016 22:28

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.4.2016 22:28
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
doMík
Člen
Avatar
doMík:18.4.2016 15:32

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

 
Odpovědět 18.4.2016 15:32
Avatar
Odpovídá na doMík
Libor Šimo (libcosenior):28.12.2016 8:22

To som rád, že si to vyriešil.
Myslíš, že by si sa mohol podeliť so svojou skúsenosťou?

Odpovědět 28.12.2016 8:22
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovědět 28.12.2016 8:43
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
doMík
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
doMík:30.12.2016 22:28

Vyřešil sem to podle toho co napsal patrik, tak už sem to nijak dál nerozváděl.

 
Odpovědět  +1 30.12.2016 22:28
Avatar
Cement
Člen
Avatar
Cement:22.12.2017 17:59

Po nastavení dle návodu hlásí chybu MSB3073, viz níže.
Co mám změnit v nastavení?
Mám VS 2017.

1>------ Build started: Project: SDLempty_IT, Configuration: Debug Win32 ------
1>Invalid number of parameters
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Com­munity\Common7\I­DE\VC\VCTarget­s\Microsoft.CppCom­mon.targets(123,5): error MSB3073: The command "xcopy “C:\Users\m3tr\Do­cuments\Visual Studio 2017\Projects\SDLem­pty_IT\SDLempty_IT\Ou­tput” “C:\Users\m3tr\Do­cuments\Visual Studio 2017\Projects\SDLem­pty_IT\Debug\” /e /I /f /y
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Com­munity\Common7\I­DE\VC\VCTarget­s\Microsoft.CppCom­mon.targets(123,5): error MSB3073: :VCEnd" exited with code 4.
1>Done building project "SDLempty_IT.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Odpovědět 22.12.2017 17:59
Když selžou všechny pokusy, použijte návod.
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Cement
patrik.valkovic:22.12.2017 22:30

Ahoj,
jedná se o chybu při kopírování .dll knihovny, ne se samotným SDL. Zkontroluj prosím, že máš nastavené správné cesty k adresáři. Eventuálně zkus přejít do složky projektu a příkaz spustit z příkazové řádky, třeba to řekne něco víc. Víc ti bohužel poradit nedokážu.
Pokud budeš mít i nadále problémy, tak bych doporučoval využít předvytvořený projekt pod článkem (pozor, nesmíš povolit Upgrade projektu pro VS 2017).

Odpovědět 22.12.2017 22:30
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Cement
Člen
Avatar
Cement:23.12.2017 13:02

Děkuji za rady, nepomohlo to.
Jaký příkaz máš na mysli xcopy?

Hlásí chybu MSB8020.

1>------ Build started: Project: SDLGame, Configuration: Debug x64 ------
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Com­munity\Common7\I­DE\VC\VCTarget­s\Microsoft.Cpp­.Platform.tar­gets(57,5): error MSB8020: The build tools for v120 (Platform Toolset = 'v120') cannot be found. To build using the v120 build tools, please install v120 build tools. Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting "Retarget solution".
1>Done building project "SDLGame.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Ještě jsem zkoušel novější návod na YouTube, tam mi hlásí chybu LNK1561.

https://www.youtube.com/watch?…

1>------ Build started: Project: SDLempty, Configuration: Debug Win32 ------
1> Creating library C:\Users\m3tr\Do­cuments\Visual Studio 2017\Projects\SDLem­pty\Debug\SDLem­pty.lib and object C:\Users\m3tr\Do­cuments\Visual Studio 2017\Projects\SDLem­pty\Debug\SDLem­pty.exp
1>LINK : fatal error LNK1561: entry point must be defined
1>Done building project "SDLempty.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Odpovědět 23.12.2017 13:02
Když selžou všechny pokusy, použijte návod.
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Cement
patrik.valkovic:23.12.2017 22:59

Ahoj,v tom případě ti s tím takto na dálku bohužel nepomůžu. Původní error to hlásilo pro xcopy příkaz. Ten jsi nastavoval v Pre-Build event. Zkus jej spustit z příkazové řádky nebo zkus pogooglit co za error to je. Takto ti s tím skutečně pomoct nedokážu.

Odpovědět 23.12.2017 22:59
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Cement
Člen
Avatar
Cement:25.12.2017 13:09

Ahoj, hlásím, že bez toho xcopy mi to chodí.
Jen pak do adresáře k exe souboru musím přikopírovat SDL2.dll, aby se program spustil.

Odpovědět  +1 25.12.2017 13:09
Když selžou všechny pokusy, použijte návod.
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 20. Zobrazit vše