PhonniX Temat założony przez niniejszego użytkownika |
[Allegro] Obracanie bitmapy » 2009-12-12 13:27:06 Witam, znów mam problem. Chce obrócić bitmapke pocisku pod danym kątem ,ale nie wiem jak mam to obliczyć: #include <allegro.h> #include <vector> #include <cmath> #include <math.h> #define PI 3.14159265
volatile long speed = 0; void increment_speed() { speed++; } END_OF_FUNCTION( increment_speed ); LOCK_VARIABLE( speed ); LOCK_FUNCTION( increment_speed );
class Pocisk { public: int x, y; int speed; int size; bool leci; };
std::vector < Pocisk > Pociski; Pocisk Bomba; Pocisk Pistolet;
int main() { allegro_init(); install_keyboard(); set_color_depth( 16 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0 ); install_timer(); install_mouse(); show_mouse( screen ); unscare_mouse(); install_int_ex( increment_speed, BPS_TO_TIMER( 80 ) ); BITMAP * bufor = NULL; BITMAP * ludek = NULL; BITMAP * plansza = NULL; BITMAP * bomba = NULL; BITMAP * pocisk = NULL; bufor = create_bitmap( 640, 480 ); if( !bufor ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "Nie mogę utworzyć bufora !" ); allegro_exit(); return 0; } ludek = load_bmp( "ludek.bmp", default_palette ); plansza = load_bmp( "plansza.bmp", default_palette ); bomba = load_bmp( "panbomba.bmp", default_palette ); pocisk = load_bmp( "pocisk.bmp", default_palette ); int ludek_x = 100, ludek_y = 100; int czekaj = 0; int bron = 1; double kat = 0; Bomba.speed = 5; Bomba.size = 30; Pistolet.speed = 30; Pistolet.size = 10; while( !key[ KEY_ESC ] ) { while( speed > 0 ) { if(( key[ KEY_RIGHT ] ) &&( ludek_x < 800 ) ) { ludek_x += 3; } else if(( key[ KEY_LEFT ] ) &&( ludek_x > 0 ) ) { ludek_x -= 3; } else if(( key[ KEY_UP ] ) &&( ludek_y > 40 ) ) { ludek_y -= 10; } if( key[ KEY_SPACE ] && czekaj <= 0 ) { if( bron == 1 ) { Bomba.x = ludek_x; Bomba.y = ludek_y; Bomba.leci = true; Pociski.push_back( Bomba ); czekaj = 100; } if( bron == 2 ) { Pistolet.x = ludek_x; Pistolet.y = ludek_y; Pistolet.leci = true; Pociski.push_back( Pistolet ); czekaj = 30; } } if( key[ KEY_Z ] ) { if( bron == 1 ) { bron = 2; } else { bron = 1; } } if( key[ KEY_Q ] ) { kat -= 0.001; } if( key[ KEY_W ] ) { kat += 0.001; } if( getpixel( plansza, ludek_x, ludek_y ) != makecol( 255, 0, 255 ) && getpixel( plansza, ludek_x, ludek_y - 3 ) != makecol( 255, 0, 255 ) && ludek_y > 40 ) ludek_y -= 3; if( getpixel( plansza, ludek_x, ludek_y ) == makecol( 255, 0, 255 ) ) ludek_y += 3; for( int i = 0; i < Pociski.size(); i++ ) { Pociski[ i ].x += sin( kat * 180.0 / M_PI ) * Pociski[ i ].speed; Pociski[ i ].y += cos( kat * 180.0 / M_PI ) * Pociski[ i ].speed; } czekaj--; speed--; } clear_to_color( bufor, makecol( 150, 150, 150 ) ); masked_blit( ludek, bufor, 0, 0, ludek_x - 20, ludek_y - 40, ludek->w, ludek->h ); masked_blit( plansza, bufor, 0, 0, 0, 0, plansza->w, plansza->h ); for( int i = 0; i < Pociski.size(); i++ ) { if( Pociski[ i ].leci ) { rotate_sprite( bufor, pocisk, Pociski[ i ].x, Pociski[ i ].y, itofix( kat * 2400 / M_PI ) ); if( getpixel( plansza, Pociski[ i ].x, Pociski[ i ].y ) != makecol( 255, 0, 255 ) || getpixel( plansza, Pociski[ i ].x + 32, Pociski[ i ].y ) != makecol( 255, 0, 255 ) || getpixel( plansza, Pociski[ i ].x, Pociski[ i ].y + 32 ) != makecol( 255, 0, 255 ) || getpixel( plansza, Pociski[ i ].x + 32, Pociski[ i ].y + 32 ) != makecol( 255, 0, 255 ) ) { circlefill( plansza, Pociski[ i ].x + 20, Pociski[ i ].y + 20, Pociski[ i ].size, makecol( 255, 0, 255 ) ); Pociski[ i ].leci = false; } } } rotate_sprite( bufor, pocisk, 100, 100, itofix( 100 *(( kat *- 66.0 / M_PI ) ) ) ); double xx = 100 * sin( kat * 180.0 / M_PI ); double yy = 100 * cos( kat * 180.0 / M_PI ); line( bufor, ludek_x, ludek_y - 20, xx + ludek_x, yy + ludek_y, makecol( 255, 128, 64 ) ); textprintf_ex( bufor, font, 10, 10, makecol( 0, 0, 0 ), - 1, "Bron:%d", bron, 7, 8 ); blit( bufor, screen, 0, 0, 0, 0, 640, 480 ); } remove_int( increment_speed ); destroy_bitmap( ludek ); destroy_bitmap( bufor ); allegro_exit(); return 0; } END_OF_MAIN();
|