Kirjoittaja: Heikki (2004).
⚠ Huomio! Tämä opas on vanhentunut. Oppaan sisältöön ei voi enää luottaa. Opas on säilytetty vain sen historiallisen arvon vuoksi. ⚠
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.
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.
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.
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:
Ohjauslippu | Selitys |
---|---|
SDL_INIT_TIMER | Ajastin |
SDL_INIT_AUDIO | Ääni |
SDL_INIT_VIDEO | Grafiikka |
SDL_INIT_CDROM | CD:n käsittely |
SDL_INIT_JOYSTICK | Peliohjantein käsittely |
SDL_INIT_EVERYTHING | Alustetaan kaikki |
Sitten lisää taulukkoa... rivillä 22 vaihdetaan resoluutio, ja taas käytetään ohjauslippuja. Tässä niistä yleisimmät:
Ohjauslippu | Selitys |
---|---|
SDL_SWSURFACE | Luo pinnan perusmuistiin |
SDL_HWSURFACE | Luo pinnan näytönohjaimen muistiin |
SDL_FULLSCREEN | Kokoruututila |
SDL_DOUBLEBUF | Käytetään kaksoispuskurointia |
SDL_OPENGL | Käytetään OpenGL:ää (ei käsitellä tässä oppaassarjassa) |
SDL_RESIZABLE | Ikkunan kokoa voidaan muuttaa (jos ikkuna ei ole kokoruudun kokoinen) |
SDL_NOFRAME | Jos 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ä:
Tietotyyppi | Kuvaus |
---|---|
Uint8 | 8-bittinen etumerkitön kokonaisluku (0 - 255) |
Uint16 | 16-bittinen etumerkitön kokonaisluku(0 - 65536) |
Uint32 | 32-bittinen etumerkitön kokonaisluku (0 - 4,3 * 10^9) |
Uint64 | 64-bittinen etumerkitön kokonaisluku (0 - 1,8 * 10^19) |
Sint8 | 8-bittinen etumerkillinen kokonaisluku (-128 - 127) |
Sint16 | 16-bittinen etumerkillinen kokonaisluku (-32768 - 32768) |
Sint32 | 32-bittinen etumerkillinen kokonaisluku (-2,1 * 10^9 - 2,1 * 10^9) |
Sint64 | 64-bittinen etumerkillinen kokonaisluku (-9,2 * 10^18 - 9,2 * 10^18) |
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
Miten tätä "ikkunanavausta" voidaan soveltaa openGL ohjelmointiin. Meneekö openGL piirtofunktiot tuohon kohtaan, jossa on kommentti "peli tähän :D"?
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 :)
Mitä noiden Pragmojen tilalle laitetaan jos ei ole Visual C:tä vaan DEV-C++?
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.
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?
Olethan aloittanut SDL-projektin? Tarkista nuo linkkerin liput (pitäisi olla -lSDL ja -lSDL_main).
Tuossa sanotaan, että se on operattori.
Se on bitti-operaatio.
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ää...
Lisäsin huomautuksen.
Jotta voisit käyttää projekteissasi __ SDL-kirastoa __ , sinun on asennettava
typo
Korjattu.
Hmm tää kiukuttelee jostakin sdl.dll tiedostoa ei löydy.
SDL.DLL filu piti vain raahata tuonne samaan folderiin. :)
lainaus:
3D-ohjelmointia ___varte___ SDL:ssä voidaan käyttää OpenGL:n ___funktiotia___.
Saa korjata. :)
Kun nyt annoit luvan niin korjasin.
hyvin kummaa, kokeilin ihan mielenkiinnon vuoksi laittaa resoluutioksi 1x1. Ei ihan toiminut
Näyttösi tuskin tukee tuota resoluutiota.
Selittäkääs joku nyt miten linuxissa käännetään ylhäällä oleva koodi. gcc:llä, mutta miten?
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.
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.
Paska opas, ei toimi opettel ohjelmoimaa...
"Se on hyvä, että tiimi toimii ja saadaan palautetta"
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.
Jartsala kirjoitti:
Paska opas, ei toimi opettel ohjelmoimaa...
Pitääkin muistaa, ettei erehdy yrittämään auttaa sua, kun palaute on tuollasta.
Jos ei muista laittaa loppuun SDL_Quit(); niin jääkö muistiin kummittelemaan jotain ohjelman sulkemisen jälkeenkin, tai koituuko siitä muita haittoja?
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...
vastalause! heikki on apina!
vitsi oli.. heikki on fiksu poika :)
ja ne keillä ei toimi on varmaan ite jotain evottanu.
Hienolta oppaalta vaikuttaa. Pitääkin perehtyä paremmalla ajalla. :)
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.
Hyvä,käytännöllinen ja ennen kaikkea kohtuu selkeä opas :D kiitän
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?
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.