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