Wasilek Temat założony przez niniejszego użytkownika |
[SDL] Prostokąty/tablice/wyświetlanie sprite » 2012-07-10 20:59:26 Mając na celu ćwiczenia z biblioteką postanowiłem się trochę pobawić ... efektem mojej pracy był pistolet wystrzeliwujący kulkę, która grzęzła w ścianie (i tutaj wszystko dobrze działało) Następnie postanowiłem zrobić to samo tylko, że dla 15 kulek ... no i tutaj pojawiają się problemy ... kulki nie powstają, a na dodatek jakimś cudem ściana przenosi się w miejsce, w którym powinna być kulka. Tutaj jest kod od pierwszej wersji - ten który działa poprawnie #include <SDL.h>
SDL_Surface * ekran = NULL; SDL_Surface * pistolet = NULL; SDL_Surface * obraz = NULL; SDL_Surface * kursor = NULL; SDL_Surface * kulka = NULL; SDL_Surface * sciana = NULL;
int myszkaX, myszkaY;
SDL_Event zdarzenie; SDL_Rect kursorr; SDL_Rect pistoletr; SDL_Rect kulkar; SDL_Rect scianar;
Uint8 * keystate = SDL_GetKeyState( NULL );
float kulkax, kulkay;
float x = 480, y = 80;
bool wyjscie = false;
void s_k() { if( kulkar.x <= scianar.x + 20 && kulkar.x + 4 >= scianar.x && kulkar.y <= scianar.y + 50 && kulkar.y + 4 >= scianar.y ) { if( kulkax < 0 ) { kulkax = kulkax + 0.012; } } }
void t_k() { kulkar.x = pistoletr.x + 4; kulkar.y = pistoletr.y + 4; kulkax = - 0.1; }
int main( int argc, char * args[] ) { SDL_Init( SDL_INIT_EVERYTHING ); ekran = SDL_SetVideoMode( 640, 400, 32, SDL_SWSURFACE | SDL_DOUBLEBUF ); obraz = SDL_LoadBMP( "tlo.bmp" ); pistolet = SDL_LoadBMP( "pistolet.bmp" ); kursor = SDL_LoadBMP( "kursor.bmp" ); sciana = SDL_LoadBMP( "sciana.bmp" ); kulka = SDL_LoadBMP( "kulka.bmp" ); scianar.x = 90; scianar.y = 50; scianar.w = 20; scianar.h = 50; kulkar.w = 4; kulkar.h = 4; kulkar.x = 640; kulkar.y = 400; pistoletr.x = x; pistoletr.y = y; kursorr.x = 0; kursorr.y = 0; SDL_BlitSurface( obraz, NULL, ekran, NULL ); SDL_SetColorKey( kursor, SDL_SRCCOLORKEY, SDL_MapRGB( kursor->format, 255, 0, 0 ) ); SDL_SetColorKey( pistolet, SDL_SRCCOLORKEY, SDL_MapRGB( pistolet->format, 255, 255, 255 ) ); SDL_SetColorKey( sciana, SDL_SRCCOLORKEY, SDL_MapRGB( sciana->format, 255, 255, 255 ) ); SDL_SetColorKey( kulka, SDL_SRCCOLORKEY, SDL_MapRGB( kulka->format, 255, 255, 255 ) ); while( !wyjscie ) { SDL_ShowCursor( SDL_DISABLE ); SDL_BlitSurface( kursor, NULL, ekran, & kursorr ); SDL_Flip( ekran ); while( SDL_PollEvent( & zdarzenie ) ) { if( zdarzenie.type == SDL_QUIT ) { wyjscie = true; } if( zdarzenie.type == SDL_MOUSEMOTION ) { kursorr.x = zdarzenie.motion.x; kursorr.y = zdarzenie.motion.y; } } if( zdarzenie.key.keysym.sym == SDLK_ESCAPE ) wyjscie = true; if( keystate[ SDLK_LEFT ] ) { x = x - 0.5; } if( keystate[ SDLK_RIGHT ] ) { x = x + 0.5; } if( keystate[ SDLK_UP ] ) { y = y - 0.5; } if( keystate[ SDLK_DOWN ] ) { y = y + 0.5; } if( keystate[ SDLK_SPACE ] ) { t_k(); } s_k(); pistoletr.x = x; pistoletr.y = y; kulkar.x = kulkar.x + kulkax; kulkar.y = kulkar.y + kulkay; SDL_BlitSurface( obraz, NULL, ekran, NULL ); SDL_BlitSurface( pistolet, NULL, ekran, & pistoletr ); SDL_BlitSurface( kulka, NULL, ekran, & kulkar ); SDL_BlitSurface( sciana, NULL, ekran, & scianar ); SDL_Flip( obraz ); SDL_Flip( pistolet ); SDL_Flip( sciana ); SDL_Flip( kulka ); } SDL_FreeSurface( pistolet ); SDL_FreeSurface( obraz ); SDL_FreeSurface( kursor ); SDL_FreeSurface( kulka ); SDL_FreeSurface( sciana ); SDL_Quit(); return 0; }
A tutaj kod dla 15 kulek. #include <SDL.h>
SDL_Surface * ekran = NULL; SDL_Surface * pistolet = NULL; SDL_Surface * obraz = NULL; SDL_Surface * kursor = NULL; SDL_Surface * kulka = NULL; SDL_Surface * sciana = NULL;
int myszkaX, myszkaY; int n = 0; SDL_Event zdarzenie; SDL_Rect kursorr; SDL_Rect pistoletr; SDL_Rect kulkar[ 15 ]; SDL_Rect scianar;
Uint8 * keystate = SDL_GetKeyState( NULL );
float kulkax[ 15 ], kulkay[ 15 ];
float x = 480, y = 80;
bool wyjscie = false;
void s_k() { for( int a; a < 15; a++ ) if( kulkar[ a ].x <= scianar.x + 20 && kulkar[ a ].x + 4 >= scianar.x && kulkar[ a ].y <= scianar.y + 50 && kulkar[ a ].y + 4 >= scianar.y ) { if( kulkax[ a ] < 0 ) { kulkax[ a ] = kulkax[ a ] + 0.012; } } }
void t_k() { kulkar[ n ].x = pistoletr.x + 4; kulkar[ n ].y = pistoletr.y + 4; kulkax[ n ] = - 0.1; n++; }
int main( int argc, char * args[] ) { SDL_Init( SDL_INIT_EVERYTHING ); ekran = SDL_SetVideoMode( 640, 400, 32, SDL_SWSURFACE | SDL_DOUBLEBUF ); obraz = SDL_LoadBMP( "tlo.bmp" ); pistolet = SDL_LoadBMP( "pistolet.bmp" ); kursor = SDL_LoadBMP( "kursor.bmp" ); sciana = SDL_LoadBMP( "sciana.bmp" ); kulka = SDL_LoadBMP( "kulka.bmp" ); for( int a = 0; a < 15; a++ ) { kulkar[ a ].w = 4; kulkar[ a ].h = 4; kulkar[ a ].x = 640; kulkar[ a ].y = 400; } scianar.x = 90; scianar.y = 50; scianar.w = 20; scianar.h = 50; pistoletr.x = x; pistoletr.y = y; kursorr.x = 0; kursorr.y = 0; SDL_SetColorKey( kursor, SDL_SRCCOLORKEY, SDL_MapRGB( kursor->format, 255, 0, 0 ) ); SDL_SetColorKey( pistolet, SDL_SRCCOLORKEY, SDL_MapRGB( pistolet->format, 255, 255, 255 ) ); SDL_SetColorKey( sciana, SDL_SRCCOLORKEY, SDL_MapRGB( sciana->format, 255, 255, 255 ) ); SDL_SetColorKey( kulka, SDL_SRCCOLORKEY, SDL_MapRGB( kulka->format, 255, 255, 255 ) ); while( !wyjscie ) { SDL_ShowCursor( SDL_DISABLE ); SDL_BlitSurface( kursor, NULL, ekran, & kursorr ); SDL_Flip( ekran ); while( SDL_PollEvent( & zdarzenie ) ) { if( zdarzenie.type == SDL_QUIT ) { wyjscie = true; } if( zdarzenie.type == SDL_MOUSEMOTION ) { kursorr.x = zdarzenie.motion.x; kursorr.y = zdarzenie.motion.y; } } if( zdarzenie.key.keysym.sym == SDLK_ESCAPE ) wyjscie = true; if( keystate[ SDLK_LEFT ] ) { x = x - 0.5; } if( keystate[ SDLK_RIGHT ] ) { x = x + 0.5; } if( keystate[ SDLK_UP ] ) { y = y - 0.5; } if( keystate[ SDLK_DOWN ] ) { y = y + 0.5; } if( keystate[ SDLK_SPACE ] ) { t_k(); } s_k(); pistoletr.x = x; pistoletr.y = y; for( int a; a < 15; a++ ) { kulkar[ a ].x = kulkar[ a ].x + kulkax[ a ]; kulkar[ a ].y = kulkar[ a ].y + kulkay[ a ]; SDL_BlitSurface( kulka, NULL, ekran, & kulkar[ a ] ); } SDL_BlitSurface( obraz, NULL, ekran, NULL ); SDL_BlitSurface( pistolet, NULL, ekran, & pistoletr ); SDL_BlitSurface( sciana, NULL, ekran, & scianar ); SDL_Flip( obraz ); SDL_Flip( pistolet ); SDL_Flip( sciana ); SDL_Flip( kulka ); } SDL_FreeSurface( pistolet ); SDL_FreeSurface( obraz ); SDL_FreeSurface( kursor ); SDL_FreeSurface( kulka ); SDL_FreeSurface( sciana ); SDL_Quit(); return 0; } Gdzie jest błąd ? :D |