SDL-tutoriaali 1
Tällä sivustolla on ollut tähän mennessä muutama tutoriaali Allegron käytöstä, koska se on helppokäyttöinen ja toimii monessa ympäristöstä. Se ei kuitenkaan suinkaan ole ainut saatavilla oleva peliohjelmointikirjasto vaan on olemassa sellainenkin kirjasto kuin SDL, joka on monessa suhteessa vielä Allegroakin parempi. Tässä pienessä tutoriaalissa opetetaan SDL:n asennus ja annetaan pieni perusohjelma alkuun pääsemiseksi.
9.1.2002 julkaistun artikkelin on kirjoittanut nuotimi1.
Mikä on SDL? #
SDL eli Simple Direct media Layer on DirectX:ään verrattavissa oleva kirjasto. SDL-kirjastot löytyvät tällä hetkellä Linuxille, Windowsille (9x,2k,Xp), MacOS:lle ja BeOS:lle. SDL on Open Sourcea, mutta tämä ei tarkoita että SDL:ää käyttävän sovelluksen lähdekoodia pitäisi julkaista (muistaakseni tätä kutsutaan LGPL:ksi). Useimmat Linuxille portatut kaupalliset pelit (Tribes2, Descent3, http://www.lokigames.com) käyttävät SDL:ää
Miksi minun pitäisi käyttää sitä? #
SDL:llä ohjelmointi on huomattavasti helpompaa kuin DirectX:llä, DirectX:ssä pitää huolehtia ns. Windows-tauhkasta (sovellusikkunoiden hallinasta jne.). DOS-ohjelmointi taas on luonteeltaan hieman erilaista. Mutta DOS? Haloo et kai tosissasi halua tehdä pelejä jotka toimivat DOS:ssa? On olemassa mysös muita kirjastoja kuten allegro, mutta se ei pärjää SDL:lle.
SDL:ään saa ilmaisia lisäkirjastoja (Osoitteesta http://www.libsdl.org), jotka tukevat esim. kehittyneempiä musiikki- (.ogg, .mp3, .xm, midi jne.) ja kuvaformaatteja (.png, .gif, .jpg jne.)
SDL-kirjastojen asennus #
Ensin tarvitaan SDL-binääri- ja kehityspaketit, jotka löytyvät http://www.libsdl.org :sta. Asennus tapahtuu eri käyttöjärjestelmissä hieman eri tavoin:
Windows:
Tarvitset SDL:n peruskirjastot SDL-1.2.3-win32.zip (http://www.libsdl.org, Download/SDL 1.2/Runtime Libraries/w32), sekä kehityskirjastot (Visual C++ 6.0) SDL-devel-1.2.3-VC6.zip (http://www.libsdl.org, Download/SDL 1.2/Development Libraries/w32)
Pura SDL-1.2.3-win32.zip (siis sitä readme-SDL.txt fileä ei tuola tietenkään tarvita) windowsin system-hakemistoon (NT,w2k,Xp system32)
Pura SDL-devel-1.2.3-VC6.zip esim. c:\SDL-1.2.3 -hakemistoon
Linux:
Tarvitset SDL:n peruskirjastot SDL-1.2.3-1.i686.rpm (http://www.libsdl.org, Download/SDL 1.2/Runtime Libraries/Linux), sekä kehityskirjastot (gcc) SDL-devel-1.2.3-1.i686.rpm (http://www.libsdl.org, Download/SDL 1.2/Development Libraries/Linux)
Asenna rpm-paketit komennoilla:
rpm -Uvh SDL-1.2.3-1.i686.rpm
ja
rpm -Uvh SDL-1.2.3-1.i686.rpm
Paketit asentuvat paikkaan X ja kaikki kirjastojen vaatimat conffaukset tehdään automaattisesti.
Koodaamaan! #
Windows:
1. Luodaan uusi projekti (new Win32 application / empty project )
2. Viritetään Visual c++ -asetukset kuntoon: Valitse Tools/Options/Directories ja pudotusvalikosta include files ja lisää siihen hakemisto, jossa SDL:n header-tiedostot sijaitsevat (C:\SDL-1.2.3\include). Seuraavaksi valitse library files ja lisää hakemisto jossa SDL-kirjastot ovat (C:\SDL-1.2.3\lib).
3. valitse Project/Settings/ C/C++ -välilehti, lehdeltä löytyy "Category" valikko. Valitse siitä code generation, vaihda "Use run-time library:" Multithreaded DLL:ksi.
4. Valitse project/Add to Project/Files ja lisää kirjastot SDL.lib ja SDLmain.lib (c:\SDL-1.2.3\lib)
5.koodia kehiin, kääntämään
Linux:
Linuxilla (Mandrake 8.1) emme lähde rakentamaan projektia, käymme siis suoraan käsiksi koodiin:
Koodi kääntyy komennolla: gcc -o main main.cpp -lSDL
Alla oleva koodi kääntyy molemmissa ympäristöissä:
(Linuxissa voit joutua muuttamaan rivin #include <SDL.h> --> #include <SDL/SDL.h>)
#include <SDL.h>
SDL_Surface *screen_surf;
void ShowBMP(char *file, SDL_Surface *screen, int x, int y)
{
SDL_Surface *image; // oma surface kuvalle
SDL_Rect dest; //alue, jolla määritetään kuvan kopioitavan datan mitat
/* Load the BMP file into a surface */
image = SDL_LoadBMP(file);
if ( image == NULL ) {
fprintf(stderr, "Not found %s: %s\n", file, SDL_GetError());
return;
}
/* kopioidaan kuvadata ruudulle. */
dest.x = x;
dest.y = y;
dest.w = image->w;
dest.h = image->h;
SDL_BlitSurface(image, NULL, screen, &dest);
/* paivitetaan ruutu */
SDL_UpdateRects(screen, 1, &dest);
/* poistetaan kuva muistista */
SDL_FreeSurface(image);
}
int main( int argc, char* argv[] )
{
//luodaan surface ruudulle
// kokoruututila |SDL_FULLSREEN flagilla
screen_surf = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);
if ( screen_surf == NULL )
{
fprintf(stderr, "Unable to set 640x480 video: %s\n",
SDL_GetError());
}
ShowBMP("kuva.bmp",screen_surf,0,0); //ladataan kuva
SDL_Delay(5000); //odotetaan 5 sekuntia
SDL_Quit();
return 0;
}
