Artikkelit

Artikkelit olivat Suomipelit.comissa sivuston sulkeuduttua. Näin ollen niihin saattaa sisältyä rikkinäisiä linkkejä tai epämääräisiä viitteitä asioihin, joita ei enää ole olemassa, ja joskus jokin saattaa näkyä väärin.

Palaa artikkelilistaan

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.

  1. Mikä on SDL?
  2. Miksi minun pitäisi käyttää sitä?
  3. SDL-kirjastojen asennus
  4. Koodaamaan!

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