Pieni esimerkki siitä, miten SDL:ää käytetään C/C++:alla.
Tästä näkee ainakin, kuinka helppoa SDL:llä on tehdä mm. kaksoispuskurointi ja BMP-kuvalataus.
EXE: http://mbnet.fi/heikki_m/salaa/sdlesim.rar
Kääntyy ainakin Visual C++ 6:lla.
Huomatkaa että piirtotyyli on erittäin hidas: ohjelma lataa joka piirtokerralla bittikartan uudelleen. Nopeutta tulee paljon lisää, jos ohjelman alussa ladataan globaalille pinnalle kuvat, joita sitten vaan näytetään. Yksinkertaisuuden takia en sitä tähän tehnyt.
edit: korjasin typoja
edit2: Funkitoiden esittelyt unohtuivat, nyt ne löytyvät.
#include "headerit.h" #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" //Toimivat vain VC++:lla, GCC:llä käännettäessä -lSDL ajaa saman asian int main( int argc, char* argv[] ) { //alustetaan SDL if( SDL_Init(SDL_INIT_VIDEO) <0 ) { fprintf(stderr, "SDL:n alustus ei onnistunut: %s\n", SDL_GetError()); return 1; } //luodaan surface ruudulle // kokoruututila |SDL_FULLSREEN flagilla naytto = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE|SDL_FULLSCREEN|SDL_DOUBLEBUF); //reso x,y, värisyvyys, liput: luodaan pinta videomuistiin+kokoruutu+kaksoispuskurointi if ( naytto == NULL ) //virhe { fprintf(stderr, "Resoluution vaihto ei onnistunut: %s\n", SDL_GetError()); } lootax=320; lootay=240; //***************************************************************** //PääLoop //***************************************************************** Piirra(); //tarvittavat muuttujat int pois=0; SDL_Event tapahtuma; //tapahtumankäsittelijä Uint8* nappi; //näppäimet while(pois == 0) { SDL_Event tapahtuma; //Poistutaanko while ( SDL_PollEvent(&tapahtuma) ) { if ( tapahtuma.type == SDL_QUIT ) { pois = 1; } if ( tapahtuma.type == SDL_KEYDOWN ) { if ( tapahtuma.key.keysym.sym == SDLK_ESCAPE ) { pois = 1; } } } //liikutetaan laatikkoa. nappi = SDL_GetKeyState(NULL); if ( nappi[SDLK_UP] ) { lootay -= 1; } if ( nappi[SDLK_DOWN] ) { lootay += 1; } if ( nappi[SDLK_LEFT] ) { lootax -= 1; } if ( nappi[SDLK_RIGHT] ) { lootax += 1; } Piirra(); //näytölle tiedot } SDL_Quit(); return 0; } //************************************************************ //Piirto ruudulle //Piirtää taustan ja lootan näytölle //************************************************************ void Piirra() { //piirtää tarvittavat jutut NaytaKuva("tausta.bmp",naytto,0,0); //taustakuva //laatikko muuttujien koordinaattien mukaisesti, koko 100*100 NaytaKuva("loota.bmp", naytto, lootax,lootay,100,100,0,0); //kaksoispuskuriin piirretty kuva näytölle SDL_Flip(naytto); } //************************************************************** //BMP-kuvan näyttö //Parametrit: tiedostonimi/polku, pinta, jossa kuva näytetään, kuvan sijainti pinnalla //Sitten kuvan korkeus ja leveys ja //************************************************************** void NaytaKuva(char *tiedosto, SDL_Surface *naytto, int nayttox, int nayttoy, int leveys, int korkeus, int kuvax, int kuvay) { SDL_Surface *kuva; // oma pinta kuvalle SDL_Rect alue; //alue, jolla määritetään kuvan kopioitavan datan mitat //ladataan kuva omalle pinnalleen kuva = SDL_LoadBMP(tiedosto); if ( kuva == NULL ) { fprintf(stderr, "Ei löytynyt %s: %s\n", tiedosto, SDL_GetError()); return; } // kopioidaan kuvadata ruudulle. alue.x = nayttox; //mille alueelle näytöllä alue.y = nayttoy; SDL_Rect alue2; //mikä alue kuvasta alue2.x = kuvax; alue2.y = kuvay; alue2.w = leveys; alue2.h = korkeus; //ja kuva näytölle SDL_BlitSurface(kuva, &alue2, naytto, &alue); //poistetaan kuva muistista SDL_FreeSurface(kuva); } //*************************************** //Yksinkertaisempi piirto //Voi käyttää jos ei ole tarvetta niin monille parametreille //*************************************** void NaytaKuva(char *tiedosto, SDL_Surface *naytto, int x, int y) { SDL_Surface *kuva; //kuvalle oma pinta kuva = SDL_LoadBMP(tiedosto); //ladataan kuva if ( kuva == NULL ) { fprintf(stderr, "Ei löytynyt %s: %s\n", tiedosto, SDL_GetError()); return; } //mihin näytöllä SDL_Rect alue; alue.x = x; alue.y = y; //näytölle SDL_BlitSurface(kuva, NULL, naytto, &alue); }
headerit.h
#include <SDL/SDL.h> //esitellään funktiot void Piirra(); void NaytaKuva(char *tiedosto, SDL_Surface *naytto, int nayttox, int nayttoy, int leveys, int korkeus, int kuvax, int kuvay); void NaytaKuva(char *tiedosto, SDL_Surface *naytto, int x, int y); SDL_Surface * naytto; int lootax, lootay;
Kuvamuodon nimi on BMP, ei BMB. :)
Periaatteessahan toi funktionimi on väärin NaytaKuva.. eikö piirrä kuva olisi parempi, koska toihan ei näytä sitä vaan piirtää sen puskuriin, mutta noh hieno on vaikkakin itse en SDL:stä paljoa välitä.
Loistava esimerkki. Tästä on varmaankin hyötyä jatkossa.
Oho.. typoja tullut...
Ja funktionimellä ei minusta ole juurikaan väliä... Kaikki kuitenkin ymmärtävät mitä se tekee.
Mitä järkeä olla jossain headerissa funktioiden ja joidenki muuttujien esittelyt?-)
En tiedä mitä järkeä, minulla on vain sellainen tapa :D
Mistä johtuu ku tulee joku kilo virheitä käännösvaiheessa?
Jotain tommosia kaikki:
[Linker error] undefined reference to `SDL_Init'
Oletko varmasti asentanut SDL:n oikein ja laittanut projektiasetukset kuntoon?
Projekti asetukset kuntoon?
En ymmärrä miksi NaytaKuva funktio on esitelty kaksi kertaa?
//esitellään funktiot void Piirra(); void NaytaKuva(char *tiedosto, SDL_Surface *naytto, int nayttox, int nayttoy, int leveys, int korkeus, int kuvax, int kuvay); void NaytaKuva(char *tiedosto, SDL_Surface *naytto, int x, int y);
Minulla ainakin valittaa
Ei taida C:llä toimia tuollainen ylikuormitus vai mikä nyt onkaan nimeltään. Eli käännä C++-kääntäjällä.
dev-cpp vinee vaan noista funktioista
Mulla apple ja xcode
Se valittaa että ei löytyny loota.bmp could not open loota.bmp
ja sama tausta.bmp:llä että mihis ne pitäis siirtää tai laittaa ne kuvat? muuten toimii moitteettomasti.
Kummallista kun itse käännän tuon niin minulla näkyy hiiren osoitin ja lootan alkupaikka on lähes keskellä ruutua ja se liikkuu nykien, mutta tuossa valmiiksi käännetyssä versiossa ei minulla ainakaan näy hiiren osoitinta, loota on melkolailla vasemmassa ylälaidassa ja se liikkuu tasaisesti. Onko hajua mistä kiikastaa?
tkok, samaan kansioon käännetyn programmin kanssa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.