SDL:Kép mozgatása

SDL:Kép mozgatása
2012-01-26T18:29:59+01:00
2012-01-27T21:32:39+01:00
2022-11-24T12:15:40+01:00
ZakI
Windows XP alatt SDL-ben (C++) egy képet próbalok mozgatni a kurzór billentyűkkel. Ahogy elindítom felugrik az SDL ablak majd kilép. Ezt a tutorialt "használom".

#include "SDL/SDL.h" #include <string> const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; const int SCREEN_BPP = 32; SDL_Surface* screen = NULL; SDL_Surface* back = NULL; SDL_Surface* cha = NULL; SDL_Event event; int x,y; bool quit; SDL_Surface *load_image( std::string filename ) { SDL_Surface* loadedImage = NULL; SDL_Surface* optimizedImage = NULL; loadedImage = SDL_LoadBMP( filename.c_str() ); if( loadedImage != NULL ) { optimizedImage = SDL_DisplayFormat( loadedImage ); SDL_FreeSurface( loadedImage ); } return optimizedImage; } void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination ) { SDL_Rect offset; offset.x = x; offset.y = y; SDL_BlitSurface( source, NULL, destination, &offset ); } int main( int argc, char* args[] ) { x=300; y=300; quit=false; if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 ) { return 1; } back = load_image("back.bmp"); cha = load_image("cha.bmp"); screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE ); if( screen == NULL ) { return 1; } SDL_WM_SetCaption( "Application", NULL); do { if( SDL_PollEvent( &event ) ) { if( event.type == SDL_KEYDOWN ) { switch( event.key.keysym.sym ) { case SDLK_UP: x=x-1; break; case SDLK_DOWN: x=+1; break; case SDLK_LEFT: y=y-1; break; case SDLK_RIGHT: y=y+1; break; } } else if( event.type == SDL_QUIT ) { quit = true; } } apply_surface(0,0,back,screen); apply_surface(x,y,cha,screen); SDL_Flip(screen); } while (quit==true); SDL_Quit(); return 0; }
Mutasd a teljes hozzászólást!
Kipróbáltam a kódodat, és arra jutottam, hogy a load_image függvényedben az optimizedImage mindig NULL.

Az optimalizálás nélkül simán működött.
Rákerestem erre, hogy miért NULL az optimizedImage és ezt találtam.

Az a lényeg, hogy a videomode-ot előbb kell beállítani, mint ahogy a képet optimalizálnád.
Tehét így legyen:

screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE ); back = load_image("back.bmp"); cha = load_image("cha.bmp");


Egyéb:

case SDLK_DOWN: x=+1; break; <- ez gondolom x = x + 1 akart lenni, de lehetne akár ++x is.
Mutasd a teljes hozzászólást!

Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd