Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: SDL_Flip aiheuttaa segfaultin

Meitsi [31.12.2005 11:56:23]

#

Joku on nyt pielessä kun kokoajan ohjelma kaatuu segfaulttiin. Jos kommentoi SDL_Flip:in pois niin toimii, mutta kuvaa ei tietenkään näy.

Koodi:

#include <SDL/SDL.h>

SDL_Surface *ruutu, *ukko, *lattia;
SDL_Event events;

signed int force = -10;
int ukkoy, ukkox;

#define RES_X 640
#define RES_Y 480

void blit(SDL_Surface*, SDL_Surface*, int, int);
int main(int argc, char *argv[]) {
    SDL_Init(SDL_INIT_VIDEO);
    SDL_SetVideoMode(RES_X, RES_Y, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    SDL_WM_SetCaption("xd", 0);

    ukko = SDL_LoadBMP("tilet/ukko.bmp");
    SDL_SetColorKey(ukko, SDL_SRCCOLORKEY, SDL_MapRGB(ukko->format,0,0,0));
    lattia = SDL_LoadBMP("tilet/maa.bmp");
    SDL_SetColorKey(lattia, SDL_SRCCOLORKEY, SDL_MapRGB(lattia->format,0,0,0));

    bool running=true;
    while (running) {

        SDL_FillRect(ruutu, NULL, 0x000000) ;
        SDL_PollEvent(&events);
        if(events.key.keysym.sym == SDLK_ESCAPE || events.type == SDL_QUIT) running = false;
        if(events.key.keysym.sym == SDLK_UP)--ukkoy;
        if(events.key.keysym.sym == SDLK_DOWN)++ukkoy;
        if(events.key.keysym.sym == SDLK_LEFT)--ukkox;
        if(events.key.keysym.sym == SDLK_RIGHT)++ukkox;
        SDL_Flip(ruutu);
        blit(ukko, ruutu, ukkox, ukkoy);


    }

    SDL_Quit();
    return 0;
}

void blit(SDL_Surface *kuva, SDL_Surface *naytto, int x, int y)
{
  SDL_Rect alue; // mille alueellä näyttöä kuva piirretään
  alue.x = x; // koordinaatit
  alue.y = y;
  SDL_BlitSurface(kuva, NULL, naytto, &alue); // piirto
}

...ja tuo koodi on eilenillalla muutamassa minuutissa väsätty, niinkuin varmaan pastetusta funktiosta voi huomatakin, mutta en kuitenkaa huomaa tuossa mitään virhettä. Huomaisitteko te?

EDIT: Ohops, nyt ei toimi edes vaikka kommentoisi tuon pois. x( Joku mättää pahasti.

Ahaa nyt aukeaa kun ottaa fillRect:in pois. O_o outoa Grafiikkaa ei (tietenkään) näy.

Heikki [31.12.2005 12:05:17]

#

Ongelmao n se, että flippaat ruutu-osoitinta, joka on NULL koska et ole asettanut siihen mitään. Ongelmasi on SDL_SetVideoMode, joka oppaassakin neuvotaan tekemään seuraavasti:

SDL_Surface *ruutu;
ruutu=SDL_SetVideoMode(--);

Ja sitten: flippaus tehdään yleensä ihan lopuksi, taitaa tuo toki noinkin toimia mutta yleensä pääsilmukassa tehdään ensin kaikki piirto ja sitten flipataan, ts. laita blit() ennen SDL_Flippiä.

Meitsi [31.12.2005 12:07:42]

#

Äh, sen siitä saa kun koodaa pikkutunneilla :)

Tuo flippi oli tuossa kohdassa koska joku irkissä vinkkasi että kannattaa kokeilla vaihtaa sen paikkaa. Nyt toimii kivasti.

Vastaus

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

Tietoa sivustosta