Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C: SDL:n perusteita

Sivun loppuun

Heikki [26.05.2004 14:28:34]

#

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;

Antti Laaksonen [27.05.2004 14:38:39]

#

Kuvamuodon nimi on BMP, ei BMB. :)

kaviaari [27.05.2004 15:35:36]

#

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ä.

Linkku [27.05.2004 15:48:41]

#

Loistava esimerkki. Tästä on varmaankin hyötyä jatkossa.

Heikki [27.05.2004 15:57:10]

#

Oho.. typoja tullut...

Ja funktionimellä ei minusta ole juurikaan väliä... Kaikki kuitenkin ymmärtävät mitä se tekee.

tejeez [15.07.2004 10:29:01]

#

Mitä järkeä olla jossain headerissa funktioiden ja joidenki muuttujien esittelyt?-)

Heikki [15.07.2004 12:59:28]

#

En tiedä mitä järkeä, minulla on vain sellainen tapa :D

Jäynis [10.08.2004 17:59:15]

#

Mistä johtuu ku tulee joku kilo virheitä käännösvaiheessa?
Jotain tommosia kaikki:
[Linker error] undefined reference to `SDL_Init'

Heikki [12.08.2004 21:28:36]

#

Oletko varmasti asentanut SDL:n oikein ja laittanut projektiasetukset kuntoon?

PFe2005 [28.02.2005 19:18:58]

#

Projekti asetukset kuntoon?

Baglair [08.01.2006 12:57:38]

#

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

Heikki [15.01.2006 17:08:48]

#

Ei taida C:llä toimia tuollainen ylikuormitus vai mikä nyt onkaan nimeltään. Eli käännä C++-kääntäjällä.

moptim [19.10.2006 09:55:44]

#

dev-cpp vinee vaan noista funktioista

tkok [29.01.2007 18:02:48]

#

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.

Wezmel [16.04.2007 18:19:27]

#

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?

moptim [29.04.2007 20:50:29]

#

tkok, samaan kansioon käännetyn programmin kanssa.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta