programming_tutorials/02_sdl_basics/1_sdl_setup.txt

328 lines
9.7 KiB
Plaintext

SDL2 Projekt setup
A code blocks-ot fogjuk használni.
========== Windows: ====================================================================================================
Windowson sajnos nem a legtriviálisabb megcsinálni.
Én azt ajánlom, hogy NE SDL2 projektet hozzatok létre, mert nálam nem működött túl jól alapból, és nem is túl hordozható úgy.
Hozzatok létre / nyissatok meg meg egy console projektet.
-- 1. Töltsétek le az sdl2 fejlesztői konyvtárát: ------------------------------------------------------------------------
https://www.libsdl.org/download-2.0.php
Development Libraries résznél az a fájl aminek mingw van a nevében.
Direkt link a 2.0.14-eshez: https://www.libsdl.org/release/SDL2-devel-2.0.14-mingw.tar.gz
-- 2. Csomagoljátok ki: --------------------------------------------------------------------------------------------------
Ha esetleg nincs fent semmi guis cucc ami ki tudja bontani, akkor alapból powershellel is ki lehet:
tar xzvf .\SDL2-devel-2.0.14-mingw.tar.gz
(Ha a windows intézőben shift-jobbklikkeltek egy mappában, akkor lessz egy olyan opció a popup menüben,
hogy powershell nyitása itt.)
-- 3. Menjetek bele a most kicsomagolt mappába. ---------------------------------------------------------------------------
Itt van egy "x86_64-w64-mingw32" mappa. Ennek a tartalmát másoljátok át a codeblocks projektetekbe, egy SDL2 mappába.
A "x86_64-w64-mingw32" mappa tartalma 4 könyvtár: bin, include, lib, share
Ezeket kell átmásolni: <CodeBlocksProjektMappa>/SDL2/
Így fog kinézni a végső mappaszerkezet:
<CodeBlocksProjektMappa>
├───bin
├───obj
└───SDL2
├───bin
├───include
├───lib
└───share
├───proj.cbp
├───proj.depend
└───main.cpp
-- 4. Menjetek vissza a Code::Blocks-ba, és nyissátok meg a "Project->Build Options" ablakot. ------------------------------
-- 5. Jelöljétek ki a bal oldalon magát a projektet. -----------------------------------------------------------------------
(Alapból a Debug van kijelölve, de egyszerűbb, ha projektekt szinten vannak a beállítások megcsinálva.)
-- 6. Menjetek a "Search directories" fülre. -------------------------------------------------------------------------------
-- 7. A "Compiler" fülön adjátok hozzá ezt: --------------------------------------------------------------------------------
SDL2\include\SDL2
Ha megnézitek, ebben a mappában egy csomó .h fájl van. Ezt a beállítást azért csináljuk, hogy így lehessen az
SDL header fájlait includeolni:
#include <SDL.h>
-- 8. A "Linker" fülön adjátok hozzá ezt: ---------------------------------------------------------------------------------
SDL2\lib
Ha megnézitek, ebben a könvtárban ilen fájlok vannak:
libSDL2.a
libSDL2.dll.a
libSDL2.la
libSDL2main.a
libSDL2main.la
libSDL2_test.a
libSDL2_test.la
Ez azért szükséges, hogy majd a 10. lépésben a compiler megtalálja ezeket a fájlokat.
-- 9. Menjetek át a jobb oldalon a "Linker settings" fülre. ----------------------------------------------------------------
-- 10. A link libraries részhez adogassátok hotzzá a következőket (ugyan ilyen sorrendben) (Kis és nagy betűk számítanak): -
mingw32
SDL2main
SDL2.dll
user32
gdi32
winmm
dxguid
Ezek alapból elérhetőek a windowsban / a mingw-vel:
mingw32
user32
gdi32
winmm
dxguid
Ezeknek az elérési ítját kellett hozzáadni a 8. lépésben.
SDL2main
SDL2.dll
Viszont ha megnézitek a fájlokat, azok így néznek ki:
libSDL2.dll.a
libSDL2main.a
...
Látni, hogy a compiler a fájlok elején lévő "lib" szót nem veszi figyelembe, illetve a kiterjesztést sem:
libSDL2.dll.a -> SDL2.dll
libSDL2main.a -> SDL2main
etc.
-- 11. Menjetek át a "Pre/post build steps" fülre. -------------------------------------------------------------------------
Mostmár a projektnek fordulnia kell, viszont ha megpróbáljátok futtatni, akkor nem fog elindulni, mert hiányolja az SDL.dll-t.
Nyilván oda lehet másolni manuálisan is, viszont ha a "post-build steps" részhez ezt a prancsot be copy pastelitek:
XCOPY SDL2\bin\*.dll $(TARGET_OUTPUT_DIR) /D /Y
Akkor a codeblocks automatikusan oda fogja nektek másolni a build végén.
--
És kész is. A txt alján ott egy teszt main.cpp, fel kell hoznia egy ablakot, és színes vertikális csíkokkal fel kel
töltenie szép lassan, majd ha kész kilép.
-- Megj.: ------------------------------------------------------------------------------------------------------------------
Ha ilyen hibát kaptok:
ld.exe||cannot find -lSDL2main|
ld.exe||cannot find -lSDL2.dll|
||error: ld returned 1 exit status|
||=== Build failed: 3 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
Akkor először menjetek át a build log fülre, és nézzétek meg, hogy ilyesmi hibát ír-e:
<hosszú path>/ld.exe: skipping incompatible SDL2\lib/libSDL2main.a when searching for -lSDL2main
Ha igen, akkor ismételjétek meg csak a 3. lépést, annyi különbséggel, hogy nem a "x86_64-w64-mingw32" mappa tartalmát
másoljátok, hanem az "i686-w64-mingw32" mappáét.
Ez azt jelenti, hogy 32 bites módban fordít a ti fordítótok.
-- Megj. 2: ----------------------------------------------------------------------------------------------------------------
Elérhető egy működő porojekt a 04_sdl_setup mappában.
========== Linux: ========================================================================================================
Linuxon jól működik az SDL2-es projekt létrehozás, de ha console projektet szeretnétek átalakítani, akkor azt így kell:
-- 1. Rakjátok fel az SDL2-t: ----------------------------------------------------------------------------------------------
Nyilván ez a lépés disztribúció függő, viszont ami fontos, hogy a csomagban benne legyenek a fejlsztéshez szükséges dolgok.
Azaz .h fájlok pl.
Debian/Ubuntu/Raspian/...:
sudo apt install libsdl2-dev libsdl2-2.0-0
Manjaro/Arch/...:
sudo pacman -S sdl2
Fedora/...:
sudo yum install SDL2 SDL2-devel
Forráskód:
Itt a leírás, hogy hogy kell lefordítani és installálni. összesen 6/7 copy pastelhető parancs (pár perc alatt fordul):
https://wiki.libsdl.org/Installation
-- 2. Hozzatok létre / nyissatok meg meg egy console projektet. ------------------------------------------------------------
-- 3. Nyissátok meg a "Project->Build Options" ablakot. --------------------------------------------------------------------
-- 4. Jelöljétek ki a bal oldalon magát a projektet. -----------------------------------------------------------------------
(Alapból a Debug van kijelölve, de egyszerűbb, ha projektekt szinten vannak a beállítások megcsinálva.)
-- 5. Menjetek át a jobb oldalon a "Linker settings" fülre. ----------------------------------------------------------------
Az "Other linker options" részhez copy pasteljétek be az alábbit: (A Backtick-ekkel (`) együtt.)
`sdl2-config --libs`
És kész is. A txt alján ott egy teszt main.cpp, fel kell hoznia egy ablakot, és színes vertikális csíkokkal fel kel
töltenie szép lassan, majd ha kész kilép.
-- Megj.: ------------------------------------------------------------------------------------------------------------------
A fenti windowsos beállítás is működik, ha megszerzitek a fordításhoz szükséges fájlokat (.so fájlok etc).
pl ki lehet szedni .deb csomagból, vagy lefordíthatjátok magatok.
Viszont ekkor a 7. pontban más könyvtárakat kell oda beírni.
Ha lefuttatjátok a "sdl2-config --libs" parancsot egy terminálba, az ki fogja írni, hogy mit kell beállítani.
Pl nálam lefuttatva ezt írja ki:
-L/usr/lib -pthread -lSDL2
Nyilván ennek az a lényege, hogy a fordításkor ez a script a megfelelő paramétereket belerakja a linker/compiler
argumentumai közé.
-L/usr/lib nem kell, az megvan a 12. pontban
-pthread -lSDL2 -> ezeket kell hozzáadni a "Link libraries részhez"
Viszont! nem kell odaírni a "-"-t, vagy a "-l"-t!
Azaz így kell odarakni őket:
pthread
SDL2
Amúgy, ezt nagyon nem érdemes így csinálni, de a lehetőség megvan rá.
========== Teszt main.cpp: ================================================================================================
#include <string>
#include <iostream>
#include <SDL.h>
int main(int argv, char** args)
{
SDL_Window * m_window;
SDL_Renderer * m_renderer;
Uint32 flags = SDL_INIT_VIDEO | SDL_INIT_TIMER;
if (SDL_Init(flags) != 0)
{
//hiba
return 1;
}
if (SDL_CreateWindowAndRenderer(640, 480, SDL_WINDOW_SHOWN, &m_window, &m_renderer ) != 0)
{
//hiba
return 2;
}
// Clear the window with a black background
SDL_SetRenderDrawColor(m_renderer, 0, 0, 0, 255);
SDL_RenderClear(m_renderer);
// Show the window
SDL_RenderPresent( m_renderer );
int rgb[] = { 203, 203, 203, // Gray
254, 254, 31, // Yellow
0, 255, 255, // Cyan
0, 254, 30, // Green
255, 16, 253, // Magenta
253, 3, 2, // Red
18, 14, 252, // Blue
0, 0, 0 // Black
};
SDL_Rect colorBar;
colorBar.x = 0;
colorBar.y = 0;
colorBar.w = 90;
colorBar.h = 480;
// Render a new color bar every 0.5 seconds
for ( int i = 0; i != sizeof rgb / sizeof *rgb; i += 3, colorBar.x += 90)
{
SDL_SetRenderDrawColor(m_renderer, rgb[i], rgb[i + 1], rgb[i + 2], 255);
SDL_RenderFillRect(m_renderer, &colorBar);
SDL_RenderPresent(m_renderer);
SDL_Delay(500);
}
SDL_DestroyWindow(m_window);
SDL_DestroyRenderer(m_renderer);
SDL_Quit();
return 0;
}