Kirjautuminen

Haku

Tehtävät

Opasarkisto: SDL 1.2: Osa 1 - Perusteet

  1. Osa 1 - Perusteet
  2. Osa 2 - Grafiikka
  3. Osa 3 - Syötteet
  4. Osa 4 - Lisäkirjastot

Kirjoittaja: Heikki. Vuosi: 2004.

SDL on C-kielellä toteutettu multimediakirjasto, jolla on helppo tehdä nopeata grafiikkaa, käsitellä hiirtä, näppäimistöä sekä ääniä yms. Tässä opassarjassa tutustumme SDL:n ja sen lisäkirjastojen perusteisiin.

Asennus

Jotta voisit käyttää projekteissasi SDL-kirjastoa, sinun on asennettava SDL:n kehityskirjasto. SDL on tehty C-kielellä, joten sen käyttö C/C++ kielillä on helppoa (katso asennusopas). SDL:stä on tehty myös versiot useille muille kielille, kuten Javalle ja Pascalille. Lisätietoja SDL:n sivuilta.

Mikä SDL itse asiassa on?

SDL on lähinnä peliohjelmointia varten suunniteltu multimediakirjasto, jolla onnistuu kaikki peliohjelmoinnissa tarvittavat asiat, kuten grafiikka ja äänet. SDL:ää käyttävät ohjelmat ovat myös käännettävissä useille eri käyttöjärjestelmille, kuten Windowsille, Linuxille, FreeBSD:lle ja SymbianOS:ille.

Nopeutensa puolesta 2d-grafiikassa SDL pärjää kohtalaisesti esim. DirectX:lle, mutta on käytettävyydessä muita selkeästi edellä. 3D-ohjelmointia varten SDL:ssä voidaan käyttää OpenGL:n funktioita. Useiden kaupallisten pelien Linux-versiot on toteutettu SDL:llä, esimerkiksi Civilization: Call To Power.

Koodaamaan!

Nyt, kun olet lukenut kaiken turhanpäiväisen höpinän, palat varmasti halusta päästä koodaamaan. Toiveesi toteutukoon! Tehdäänpä nyt yksinkertainen ohjelma:

#include <SDL/SDL.h>  // sisällytetään SDL:n otsikkotiedostot

#pragma comment(lib, "SDLmain.lib")  // otetaan SDL:n LIB-tiedostot mukaan. Kun nämä rivit ovat ohjelman alussa,
#pragma comment(lib, "SDL.lib")      // sinun ei tarvitse lisätä LIB-tiedostoja "käsin"
// #pragma-rivit toimivat VAIN Visual c++:alla! gcc:llä parametri -lSDL ajaa saman asian

int main(int argc, char *argv[]) {

	// nyt meidän tulee alustaa SDL. Tämä onnistuu SDL_Init() funktiolla, jolle annetaan parametrina
	// tieto siitä, mitkä SDL:n osat alustetaan, tässä tapauksessa vain video-ominaisuudet
	if( SDL_Init(SDL_INIT_VIDEO) < 0 )  // paluuarvon ollessa pienempi kuin 0, tapahtui virhe
	{
		fprintf(stderr, "SDL:n alustus ei onnistunut: %s\n", SDL_GetError()); // virheestä tiedot tiedostoon
		return 0; // lopetetaan ohjelma
	}

	// SDL on nyt alustettu virheettömästi, seuraavaksi onkin aika vaihtaa resoluutiota
	// ensin on kuitenkin luotava pinta, joka kattaa näytön sisällön:
	SDL_Surface * naytto;
	// SDL_Surface on siis SDL:n oma tyyppi, jota käytetään eri pintoja varten, tästä lisää myöhemmin

	// sitten resoluution vaihtaminen. SDL_SetVideoMode-funktio vaihtaa resoluution
	// parametreina sille annetaan uusi resoluutio, värisyvyys (tässä 32-bittinen) ja sitten ohjausliput
	// tässä tapauksessa ohjausliput tarkoittavat, että pinta luodaan näytönohjaimen muistiin ja
	// ohjelma asetetaan kokoruututilaan (katso taulukko lopusta)
	naytto = SDL_SetVideoMode(1024, 768, 32, SDL_HWSURFACE|SDL_FULLSCREEN);

	// peli tähän :D

	// odotetaan 5 sekuntia
	SDL_Delay(5000);

	SDL_Quit(); // "suljetaan" SDL
	return 0;
}

Kopioi esimerkkiohjelman lähdekoodi.

Luepa koodi nyt rauhassa lävitse, ja yritä ymmärtää kaikki. Käydäänpä vielä lävitse pari asiaa koodista:

Alussa on #pragma-rivejä. Ne ovat VisualC++:n omaa "standardia" eivätkä toimi muilla kääntäjillä. VC++:n käyttäjille tämä on kätevää, sillä näiden rivien ollessa mukana ei sinun tarvitse enään hakea valikoista lib-tiedostoja (katso asennusopas). GCC:llä parametri -lSDL ajaa saman asian.

Huomautus!: Ainakin Visual C++ 6:lla tulee linkityksessä virhe LNK 2019 jos main-funktiolle ei anneta parametreja, eli main-funktio on oltava muotoa main( int argc, char *argv[] ). Katso Chezecow:n kommentti alhaalta.

Rivillä 7 annetaan SDL:n alustusfunktiolle parametriksi SDL_INIT_VIDEO, joka tarkoittaa siis grafiikkaominaisuuksien alustamista. Muitakin asioita voidaan alustaa samassa funktiossa yhdistelemällä niitä loogisen TAI-operaattorin (|) avulla. Tässä sinulle yleisimmät alustusliput selityksineen:

OhjauslippuSelitys
SDL_INIT_TIMERAjastin
SDL_INIT_AUDIOÄäni
SDL_INIT_VIDEOGrafiikka
SDL_INIT_CDROMCD:n käsittely
SDL_INIT_JOYSTICKPeliohjantein käsittely
SDL_INIT_EVERYTHINGAlustetaan kaikki

Sitten lisää taulukkoa... rivillä 22 vaihdetaan resoluutio, ja taas käytetään ohjauslippuja. Tässä niistä yleisimmät:

OhjauslippuSelitys
SDL_SWSURFACELuo pinnan perusmuistiin
SDL_HWSURFACELuo pinnan näytönohjaimen muistiin
SDL_FULLSCREENKokoruututila
SDL_DOUBLEBUFKäytetään kaksoispuskurointia
SDL_OPENGLKäytetään OpenGL:ää (ei käsitellä tässä oppaassarjassa)
SDL_RESIZABLEIkkunan kokoa voidaan muuttaa (jos ikkuna ei ole kokoruudun kokoinen)
SDL_NOFRAMEJos mahdollista, SDL luo ikkunan ilman tilapalkkia yms. Automaattisesti käytettäessä lippua SDL_FULLSCREEN

Loppuksi voisimme vilkaista vielä yhtä taulukkoa. SDL tuo mukanaan uusia muuttujatyyppejä:

TietotyyppiKuvaus
Uint88-bittinen etumerkitön kokonaisluku (0 - 255)
Uint1616-bittinen etumerkitön kokonaisluku(0 - 65536)
Uint3232-bittinen etumerkitön kokonaisluku (0 - 4,3 * 10^9)
Uint6464-bittinen etumerkitön kokonaisluku (0 - 1,8 * 10^19)
Sint88-bittinen etumerkillinen kokonaisluku (-128 - 127)
Sint1616-bittinen etumerkillinen kokonaisluku (-32768 - 32768)
Sint3232-bittinen etumerkillinen kokonaisluku (-2,1 * 10^9 - 2,1 * 10^9)
Sint6464-bittinen etumerkillinen kokonaisluku (-9,2 * 10^18 - 9,2 * 10^18)

Loppusanat

Olet nyt saanut ensikosketuksen SDL:n ihmeelliseen maailmaan. Tässä osassa emme oppineet vielä juuri mitään, mutta tulevissa osissa pureudumme syvemmälle SDL:n kiemuroihin, ja tutustumme mm. bittikarttojen käyttämiseen ja näppäimistön käsittelyyn.

Viimeksi muokattu 15.1.2006


Kommentit

TeeVee [30.12.2004 11:19:41]

Lainaa #

Miten tätä "ikkunanavausta" voidaan soveltaa openGL ohjelmointiin. Meneekö openGL piirtofunktiot tuohon kohtaan, jossa on kommentti "peli tähän :D"?

Metabolix [31.12.2004 02:51:45]

Lainaa #

Kerropa, Heikki, mitä pitää laittaa Linuxissa SDL-ohjelman mukaan kun Linux ei taida tuntea DLL-tiedostoja? Jos satut OpenGL:n lisukkeista tietämään, niin kerro sekin. Jos et kerro, en tee ikinä yhtään Linux-projektia :)

InvalidCo [29.01.2005 18:44:53]

Lainaa #

Mitä noiden Pragmojen tilalle laitetaan jos ei ole Visual C:tä vaan DEV-C++?

Heikki [30.01.2005 12:05:45]

Lainaa #

PC-master: Linkkerille annetaan liput -lSDL ja -lSDL_main. Nämä tulevat automaattisesti jos asennat SDL:n DevPackin ja aloitat SDL-projektin.

TeeVee: OpenGL:ää käytettäessä ikkunan luontiin annetaan lippu SDL_OPENGL, jonka jälkeen ikkunaan voidaan käsittääkseni piirtää OpenGL:llä. En tiedä paremmin, täytyy joskus perehtyä.

Metabolix: Linuxissa tarvitaan SDL:n .so-tiedostot (Linuxissa .so [shared object tms] vastaa Windowsin .dll:ää). Nuo tosin löytyvät SDL:n sivuilta ainoastaan rpm-paketissa, tai sitten ne pitää luoda kääntäen SDL lähdekoodista Linuxissa.

PFe2005 [28.02.2005 14:36:53]

Lainaa #

Minä käytän Devcpptä ja olen asentanut siihen SDL:llän, mutta tulee tälläisiä valituksia: [Linker error] undefined reference to `SDL_Init', [Linker error] undefined reference to `SDL_GetError' , [Linker error] undefined reference to `SDL_SetVideoMode' , [Linker error] undefined reference to `SDL_Delay' [Linker error] undefined reference to `SDL_Quit' , [Linker error] undefined reference to `WinMain@16' ja ld returned 1 exit status. Misää vika?

Heikki [03.03.2005 00:34:22]

Lainaa #

Olethan aloittanut SDL-projektin? Tarkista nuo linkkerin liput (pitäisi olla -lSDL ja -lSDL_main).

Megant92 [11.03.2005 16:27:03]

Lainaa #

Tuossa sanotaan, että se on operattori.
Se on bitti-operaatio.

Chezecow [14.03.2005 23:27:03]

Lainaa #

Tässä teille pikkuruinen pähkinä:

Kääntäjänä on Siis Visual C++ 6.0, Visual Studio 2002

Ja mikäli siis sisällytän SDL:n projektiini ja koodini näyttää osittain tältä:

#include <SDL/SDL.h>
...
#pragma comment(lib, "SDLmain.lib")
#pragma comment(lib, "SDL.lib")
...
int main() {return 0;};

Saan LNK 2019 virheen (external unresloved symbol), SDL siis esittelee funktion _main joka löytyy myös vakkarikirjastoista (/VERBOSE, näin sen käsitin), mutta jos koodini on muuten identtistä, ja kirjoitan sen näin:

#include <SDL/SDL.h>
...
#pragma comment(lib, "SDLmain.lib")
#pragma comment(lib, "SDL.lib")
...
int main(int argc, char *argv[]) {return 0;};

Ohjelmani kääntyy vallan mainiosti, eli jos joku saa päänvaivaa tuosta varoituksesta niin tässä siihen lääke. Minulla vaan sattuu olemaan se paha tapa etten koskaan laita noita argumentteja tuonne, joten tuo aiheutti päänvaivaa...

Tämän voisi tietty pikkuruisena kommenttina lisätä tuonne koodiin, jottei muiden tarvitse kirjoitella kymmentä minuuttia jotta saa selville mikä mättää...

Heikki [08.04.2005 23:39:30]

Lainaa #

Lisäsin huomautuksen.

TeeVee [09.04.2005 22:50:13]

Lainaa #

Jotta voisit käyttää projekteissasi __ SDL-kirastoa __ , sinun on asennettava


typo

Heikki [15.04.2005 22:45:33]

Lainaa #

Korjattu.

Teuro [27.09.2005 18:36:13]

Lainaa #

Hmm tää kiukuttelee jostakin sdl.dll tiedostoa ei löydy.

SDL.DLL filu piti vain raahata tuonne samaan folderiin. :)

Draiz [05.01.2006 00:26:48]

Lainaa #

lainaus:

3D-ohjelmointia ___varte___ SDL:ssä voidaan käyttää OpenGL:n ___funktiotia___.

Saa korjata. :)

Heikki [15.01.2006 17:10:01]

Lainaa #

Kun nyt annoit luvan niin korjasin.

Baglair [21.01.2006 15:18:54]

Lainaa #

hyvin kummaa, kokeilin ihan mielenkiinnon vuoksi laittaa resoluutioksi 1x1. Ei ihan toiminut

exAtuu [14.03.2006 22:32:45]

Lainaa #

Näyttösi tuskin tukee tuota resoluutiota.

deXXu [01.08.2006 11:52:06]

Lainaa #

Selittäkääs joku nyt miten linuxissa käännetään ylhäällä oleva koodi. gcc:llä, mutta miten?

Heikki [01.08.2006 12:22:18]

Lainaa #

Kuten kommenteissa sanotaan, ensin on otettava #pragma-rivit pois. Tämän jälkeen kääntö:
gcc tiedosto.c -o ohjelma -lSDL
Ja suoritetaan komennolla ./ohjelma

Jos koodi taas on C++:aa, käytetään gcc:n tilalla g++:aa.

moptim [12.11.2006 08:25:04]

Lainaa #

PFe2005: olethan kirjoittanut ylös rivin:

#include <SDL/SDL.h>

EDIT: Käännä näin: gcc sdlnacki -o sdlnacki -lSDL -lSDLmain
EDIT2: Ypsis, nyt pitäs toimia.

Jartsala [12.03.2007 15:43:22]

Lainaa #

Paska opas, ei toimi opettel ohjelmoimaa...

Heikki [12.03.2007 16:40:45]

Lainaa #

"Se on hyvä, että tiimi toimii ja saadaan palautetta"

hunajavohveli [12.03.2007 16:42:38]

Lainaa #

Jartsala kirjoitti:

Paska opas, ei toimi opettel ohjelmoimaa...

Aloittamastasi keskusteluaiheesta päätellen se ei toimi, koska et osaa soveltaa sitä. Opettele nyt vain ne perusteet ensin, ennen kuin tulet tuollaisia kommentteja heittämään.

Blaze [17.03.2007 22:01:19]

Lainaa #

Jartsala kirjoitti:

Paska opas, ei toimi opettel ohjelmoimaa...

Pitääkin muistaa, ettei erehdy yrittämään auttaa sua, kun palaute on tuollasta.

Makesmi [24.03.2007 17:26:39]

Lainaa #

Jos ei muista laittaa loppuun SDL_Quit(); niin jääkö muistiin kummittelemaan jotain ohjelman sulkemisen jälkeenkin, tai koituuko siitä muita haittoja?

moptim [26.03.2007 20:24:33]

Lainaa #

Heikki opasta kirjoittaessaan kirjoitti:

Katso Chezecow:n kommenti alhaalta

Hieman lisähommia.

Jartsala kirjoitti:

Paska opas, ei toimi opettel ohjelmoimaa...

Ööh? En aivan ymmärtänyt. Opettele suomea.

ÄDYT: Ajuu, nyt honasin: "Paska opas, ei toimi. Opettele ohjelmoimaan...". Kyllä Heikki aika varmasti osaa ohjelmoida, jos on tämänkin oppaan tehnyt...

pienipoika [07.05.2008 17:27:23]

Lainaa #

vastalause! heikki on apina!

vitsi oli.. heikki on fiksu poika :)
ja ne keillä ei toimi on varmaan ite jotain evottanu.

plastic [08.07.2008 11:50:59]

Lainaa #

Hienolta oppaalta vaikuttaa. Pitääkin perehtyä paremmalla ajalla. :)

ankzilla [23.09.2009 23:22:30]

Lainaa #

Mahtava opas! Pakko kokeilla kuvan näyttöä joku päivä.
Mutta ainoa tässä oppaassa olivat huono juttu tämä eräs kommentoija.
Pitäähän sitä nyt olla vitun tyytyväinen että joku ilmaiseksi tämmöstä tänne vääntää.
Vituttaa.

Lööri [21.05.2010 23:07:31]

Lainaa #

Hyvä,käytännöllinen ja ennen kaikkea kohtuu selkeä opas :D kiitän

pelammin [18.04.2011 15:14:13]

Lainaa #

Yritin asentaa SDL:ää Visual Studio 2010:een.

Virheitä ei tule ja ohjelma lähtee käyntiin, mutta kuva jonka lataan ei näy ruudulla (ruutu reakoi muutoksiin esim. SDL_FULLSCREEN) luulen että vika on jossain Studion asetuksissa.

Muistin kyllä Flipin, koska ohjelma toimii Code Blockssissa, joka on minusta jopa parempi työkalu kuin Studio, mutta olisihan se mukava saada SDL toimimaan molemmissa.

Onko jollakin ollut samanlaisia ongelmia?

Kirjoita kommentti

Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.

Muista lukea keskustelun ohjeet.
Tietoa sivustosta