PROgress Temat założony przez niniejszego użytkownika |
[SDL, C++] Zamazywanie tła przez bitmapę » 2010-08-13 23:20:52 Dobra, problem wydaje się głupi, ale nie mogę z niego jakoś wybrnąć... Poprzeglądałem sobie wszystkie tematy i nic. Mianowicie chodzi o to ,iż rysuję postać, zmieniam jej tło na przeźroczyste i kiedy nią poruszam postać zostawia za sobą ślad(ona sama się rozmazuje). Dam jeszcze kod: include < SDL.h >
int bohater_x = 0; int bohater_y = 0;
bool myExit = false;
SDL_Surface * ekran = NULL; SDL_Surface * bitmap = NULL; SDL_Rect rct_bitmap; SDL_Event main_event;
Uint8 * keystate = SDL_GetKeyState( NULL );
int main( int argc, char * argv[] ) { SDL_Init( SDL_INIT_EVERYTHING ); ekran = SDL_SetVideoMode( 800, 600, 32, SDL_SWSURFACE ); SDL_WM_SetCaption( "TEST", NULL ); bitmap = SDL_LoadBMP( "test.bmp" ); SDL_SetColorKey( bitmap, SDL_SRCCOLORKEY, SDL_MapRGB( bitmap->format, 255, 0, 255 ) ); rct_bitmap.w = bitmap->w; rct_bitmap.h = bitmap->h; SDL_FillRect( ekran, NULL, 0 ); while( !myExit ) { while( SDL_PollEvent( & main_event ) ) { if( main_event.type == SDL_QUIT ) { myExit = true; } } if( keystate[ SDLK_RIGHT ] ) { bohater_x++; } if( keystate[ SDLK_LEFT ] ) { bohater_x--; } if( keystate[ SDLK_UP ] ) { bohater_y--; } if( keystate[ SDLK_DOWN ] ) { bohater_y++; } if( keystate[ SDLK_ESCAPE ] ) { myExit = true; } rct_bitmap.x = bohater_x; rct_bitmap.y = bohater_y; SDL_BlitSurface( bitmap, NULL, ekran, & rct_bitmap ); SDL_Flip( ekran ); } SDL_FreeSurface( bitmap ); SDL_Quit(); return 0; } Być może chodzi o linijki dotyczące rysowania i aktualizacji obrazka i ekranu... Proszę o pomoc:/ |
|
kamillo121 |
» 2010-08-13 23:27:43 Ekran zamalowujesz tylko raz przed pętlą na czarno "SDL_FillRect..." jeżeli to dasz na początku ale w pętli while to powinno być okey ;]
//Oczywiście w tej pierwszej głównej pętli while
dzieje się tak dlatego, że kopiujesz postać na "ekran" w nowej pozycji ale to nie znaczy, że zniknie ze starej, po prostu "domalujesz" do starego renderu postać w nowej pozycji co w efekcie da rozmnożoną postać ;D |
|
PROgress Temat założony przez niniejszego użytkownika |
» 2010-08-13 23:44:22 Okej, stokrotne dzięki!:D Teraz jeszcze jedno pytanko. Gdy rysuję teraz postać na jakimś tle to wydajność programu drastycznie spada... Kodzik:
//wszystko co wyżej SDL_BlitSurface(tlo, NULL, ekran, NULL); SDL_BlitSurface(bitmap, NULL, ekran, &rct_bitmap); SDL_Flip(ekran); //dalsza część pętli...
|
|
kamillo121 |
» 2010-08-13 23:46:47 co znaczy, że wydajność spada ? jak to obserwujesz ? |
|
PROgress Temat założony przez niniejszego użytkownika |
» 2010-08-13 23:56:06 Sprite porusza się znacznie wolniej niż dotychczas:/ |
|
kamillo121 |
» 2010-08-14 00:05:30 No to raczej niemożliwe, musiałbyś mieć strasznie zmulonego kompa, żeby odczuć spowolnienie przez dodanie takich rzeczy, może ci się tylko wydaje:) A co do poruszania postacią możesz zmienić dwie rzeczy: co do keystat, gdy użytkownik nie naciśnie żadnego klawisza to po co sprawdzać czy naciśnięty klawisz to left itd ? nie lepiej tak : while(...) { while(...) { if( event.type == SDL_KEYDOWN ) { tutaj sprawdasz keystate } } }
a druga sprawa to tak, że używasz zmiennych bohater_x i y gdzie te zmienne służą jako "wektor" przesunięcia, ale skoro nie masz jakiejś rozbudowanej fizyki itd to możesz po prostu: if( keystate[ SDLK_RIGHT ] ) { rct_bitmap.x++; } itd
dzięki czemu nie musisz przypisywać potem do zmiennych rct_bitmap.x i y zmiennych bohater_x i y |
|
PROgress Temat założony przez niniejszego użytkownika |
» 2010-08-14 00:12:22 OK, dzięki za wszystko. Popracuję nad tym i postaram się coś wykombinować;) |
|
« 1 » |