programator Temat założony przez niniejszego użytkownika |
[SDL, C++] Problem z wyświetlaniem bitmapy » 2010-08-14 11:03:19 Nie chciałem pisać tego na forum, ale nie mam wyboru, nie potrafię nic na ten problem poradzić... Proszę, powiedzcie co jest nie tak z tym kodem? #include <SDL.h>
int main( int argc, char * args[] ) { SDL_Surface * ekran = NULL; SDL_Surface * tlo = NULL; SDL_Surface * ludek = NULL; SDL_Rect przesuniencie_ludka; Uint8 * keystate = SDL_GetKeyState( NULL ); SDL_Event zdarzenie; bool wyjscie = false; SDL_Init( SDL_INIT_EVERYTHING ); ekran = SDL_SetVideoMode( 1260, 600, 32, SDL_SWSURFACE ); SDL_WM_SetCaption( "Ludek", NULL ); tlo = SDL_LoadBMP( "bg.bmp" ); ludek = SDL_LoadBMP( "ludek.bmp" ); SDL_SetColorKey( ludek, SDL_SRCCOLORKEY, SDL_MapRGB( ludek->format, 255, 255, 255 ) ); while( !wyjscie ) { SDL_FillRect( ekran, NULL, 0 ); while( SDL_PollEvent( & zdarzenie ) ) { if( zdarzenie.type == SDL_QUIT ) wyjscie = true; } if( keystate[ SDLK_RIGHT ] ) przesuniencie_ludka.x++; else if( keystate[ SDLK_LEFT ] ) przesuniencie_ludka.x--; else if( keystate[ SDLK_UP ] ) przesuniencie_ludka.y--; else if( keystate[ SDLK_DOWN ] ) przesuniencie_ludka.y++; SDL_BlitSurface( tlo, NULL, ekran, NULL ); SDL_BlitSurface( ludek, NULL, ekran, & przesuniencie_ludka ); SDL_Flip( ekran ); } SDL_FreeSurface( ludek ); SDL_FreeSurface( tlo ); SDL_Quit(); return 0; }
Kompiluje sie, uruchamia, ale nie wyświetla "ludka". Oto jak to wygląda: [url href="http://zapisz.net/images/742_zrzut_ekranu.png" nazwa="Klik"/] Najgorsze jest to, że raz mi ten kod nawet działał... Tzn. Ludek poruszał się po planszy. Przy następnym uruchomieniu już nie... |
|
szyx_yankez |
» 2010-08-14 11:57:29 Tytuł powinien być taki: "Dziwnie zaprogramowany program", bo w końcu jak go napisałeś tak się zachowuje. |
|
programator Temat założony przez niniejszego użytkownika |
» 2010-08-14 12:39:23 W takim razie co jest w nim takiego dziwnego? Co jest źle? |
|
kamillo121 |
» 2010-08-14 12:44:41 Skoro nie udzielasz pomocy to po co spamujesz ? nabijasz posty ?
Nie flipuj tła a potem ekranu, skoro wszytko malujesz na buforze (surface ekran) to flipuj tylko ekran SDL_Flip(ekran); a nie SDL_Flip(tlo); SDL_Flip(ekran); |
|
programator Temat założony przez niniejszego użytkownika |
» 2010-08-14 12:55:12 Poprawiłem, ale efekt jest ten sam. Po pierwszym skompilowaniu i uruchomieniu wyświetla ludzika. Za drugim razem już nie... |
|
kamillo121 |
» 2010-08-14 12:58:13 a spróbuj zmienić na taki kod i zobacz czy za drugim razem (wtedy jak nie wyświetla ludzika) czy program się od razu wyłączy: #include <SDL.h>
int main( int argc, char * args[] ) { SDL_Surface * ekran = NULL; SDL_Surface * tlo = NULL; SDL_Surface * ludek = NULL; SDL_Rect przesuniencie_ludka; Uint8 * keystate = SDL_GetKeyState( NULL ); SDL_Event zdarzenie; bool wyjscie = false; SDL_Init( SDL_INIT_EVERYTHING ); ekran = SDL_SetVideoMode( 1260, 600, 32, SDL_SWSURFACE ); SDL_WM_SetCaption( "Ludek", NULL ); tlo = SDL_LoadBMP( "bg.bmp" ); ludek = SDL_LoadBMP( "ludek.bmp" ); if( ludek == NULL ) return 0; SDL_SetColorKey( ludek, SDL_SRCCOLORKEY, SDL_MapRGB( ludek->format, 255, 255, 255 ) ); while( !wyjscie ) { SDL_FillRect( ekran, NULL, 0 ); while( SDL_PollEvent( & zdarzenie ) ) { if( zdarzenie.type == SDL_QUIT ) wyjscie = true; } if( keystate[ SDLK_RIGHT ] ) przesuniencie_ludka.x++; else if( keystate[ SDLK_LEFT ] ) przesuniencie_ludka.x--; else if( keystate[ SDLK_UP ] ) przesuniencie_ludka.y--; else if( keystate[ SDLK_DOWN ] ) przesuniencie_ludka.y++; SDL_BlitSurface( tlo, NULL, ekran, NULL ); SDL_BlitSurface( ludek, NULL, ekran, & przesuniencie_ludka ); SDL_Flip( ekran ); } SDL_FreeSurface( ludek ); SDL_FreeSurface( tlo ); SDL_Quit(); return 0; }
a i weż ustaw początkowe wartości w przesuniecie_ludka(x,y,w,h) ;) być może to właśnie przez to, że nie ustawiasz wartości początkowych wychodzą dziwne wartości i nie wyświetla bitmapy |
|
programator Temat założony przez niniejszego użytkownika |
» 2010-08-14 13:08:41 Jesteś genialny!:) Wielkie dzięki, problem leżał w tym, że wszystkie zmienne (w tym przesuniencie_ludka) były zadeklarowane w main, czyli lokalnie. A w zmiennych lokalnych są śmieci. Rozwiązaniem jest tak jak napisałeś zainicjowanie wszystkich zmiennych zerami lub zrobienie ich zmiennymi globalnymi (te są automatycznie inicjowane zerami) Jestem Ci winien piwo:P Jeszcze raz dzięki. |
|
kamillo121 |
» 2010-08-14 13:10:12 Spoko, od tego jesteśmy by sobie pomagać..ale nawiasem mówiąc żubra proszę ;) |
|
« 1 » |