Saiph Temat założony przez niniejszego użytkownika |
[Allegro] Niepoprawne wyświetlanie mapy » 2010-05-06 19:50:03 #include<allegro.h> #include <vector>
int const X = 640, Y = 480; volatile long SpeedPocisku = 0; void increment_SpeedPocisku() { SpeedPocisku++; } END_OF_FUNCTION( increment_SpeedPocisku ); LOCK_VARIABLE( SpeedPocisku ); LOCK_FUNCTION( increment_SpeedPocisku );
volatile long SpeedSrollowaniaMapy = 0; void increment_SpeedSrollowaniaMapy() { SpeedSrollowaniaMapy++; } END_OF_FUNCTION( increment_SpeedSrollowaniaMapy ); LOCK_VARIABLE( SpeedSrollowaniaMapy ); LOCK_FUNCTION( increment_SpeedSrollowaniaMapy );
volatile long SpeedStatku = 0; void increment_SpeedStatku() { SpeedStatku++; } END_OF_FUNCTION( increment_SpeedStatku ); LOCK_VARIABLE( SpeedStatku ); LOCK_FUNCTION( increment_SpeedStatku );
volatile long TimerCooldown = 0; void increment_TimerCooldown() { TimerCooldown++; } END_OF_FUNCTION( increment_TimerCooldown ); LOCK_VARIABLE( TimerCooldown ); LOCK_FUNCTION( increment_TimerCooldown );
volatile int fps = 0; volatile int fpsCounter = 0; void FramesPerSecond() { fps = fpsCounter; fpsCounter = 0; } END_OF_FUNCTION( FramesPerSecond ) LOCK_VARIABLE( fps ); LOCK_FUNCTION( FramesPerSecond );
void init(); void deinit();
class Cstatek { public: int x, y; Cstatek::Cstatek(); }; Cstatek::Cstatek() : x( 10 ) , y( 30 ) { }
class Cpocisk { public: int x, y; bool boom; double dx, dy; Cpocisk::Cpocisk( int xx, int xy, bool xboom, double xdx, double xdy ); }; Cpocisk::Cpocisk( int xx, int xy, bool xboom, double xdx, double xdy ) : x( xx ) , y( xy ) , boom( xboom ) , dx( xdx ) , dy( xdy ) { }
int main() { init(); BITMAP * bufor = create_bitmap( X, Y ); BITMAP * BstatekGracza = NULL; BstatekGracza = create_bitmap( 20, 30 ); clear_to_color( BstatekGracza, makecol( 255, 255, 255 ) ); BITMAP * Bshot = NULL; Bshot = create_bitmap( 5, 20 ); clear_to_color( Bshot, makecol( 255, 0, 255 ) ); BITMAP * Bmapa = create_bitmap( 64, 64 ); clear_to_color( Bmapa, makecol( 150, 150, 150 ) ); rectfill( Bmapa, 32, 0, 64, 32, makecol( 255, 255, 255 ) ); Cstatek statek; std::vector < Cpocisk > pocisk; int zm = 0; bool strzal = false; double v = 0.33; pocisk.push_back( Cpocisk( 50, 50, true, 0, 0 ) ); int licznik_x = 0, licznik_y = 0; int mapaX = 0, mapaY = 0; short int map[ 15 ][ 40 ] = { 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; while( !key[ KEY_ESC ] ) { fpsCounter++; clear_bitmap( bufor ); for( licznik_x = 0; licznik_x < 21; licznik_x++ ) { for( licznik_y = 0; licznik_y < 16; licznik_y++ ) { blit( Bmapa, bufor, ( map[ licznik_y + mapaY ][ licznik_x + mapaX ] % 2 ) * 32, ( map[ licznik_y + mapaY ][ licznik_x + mapaX ] / 2 ) * 32, licznik_x * 32, licznik_y * 32, 32, 32 ); } } while( SpeedStatku > 0 ) { if( key[ KEY_UP ] ) statek.y--; if( key[ KEY_DOWN ] ) statek.y++; if( key[ KEY_LEFT ] ) statek.x--; if( key[ KEY_RIGHT ] ) statek.x++; SpeedStatku--; } if( statek.y <= 0 ) statek.y = 0; if( statek.y >= Y - BstatekGracza->h ) statek.y = Y - BstatekGracza->h; if( statek.x <= 0 ) statek.x = 0; if( statek.x >= X - BstatekGracza->w ) statek.x = X - BstatekGracza->w; while( SpeedSrollowaniaMapy > 0 ) { if( key[ KEY_D ] ) mapaX++; if( key[ KEY_A ] ) mapaX--; SpeedSrollowaniaMapy--; } if( mapaX > 19 ) mapaX = 19; if( mapaX < 0 ) mapaX = 0; while( TimerCooldown > 0 ) { zm++; if( zm >= 200 ) zm = 0; TimerCooldown--; } if( key[ KEY_SPACE ] ) { strzal = true; } if( strzal == true ) { if( zm >= 99 && zm <= 101 ) { pocisk.push_back( Cpocisk( statek.x, statek.y, true, 0, statek.y ) ); strzal = false; } } for( int i = 0; i <= int( pocisk.size() ); i++ ) { if( pocisk[ i ].boom == true ) { masked_blit( BstatekGracza, bufor, 0, 0, pocisk[ i ].x, pocisk[ i ].y, Bshot->w, Bshot->h ); } if( int( pocisk.size() ) >= 30 ) { if( pocisk[ i ].x >= X ) pocisk.erase( pocisk.begin() + i - 1 ); } } while( SpeedPocisku > 0 ) { for( int i = 0; i <= int( pocisk.size() ); i++ ) { if( pocisk[ i ].boom == true ) { pocisk[ i ].dx += v; pocisk[ i ].dx += v; if( pocisk[ i ].dx >= 1 || pocisk[ i ].dx <= - 1 ) { pocisk[ i ].x += int( pocisk[ i ].dx ); pocisk[ i ].dx = pocisk[ i ].dx - int( pocisk[ i ].dx ); } } } SpeedPocisku--; } masked_blit( BstatekGracza, bufor, 0, 0, statek.x, statek.y, BstatekGracza->w, BstatekGracza->h ); textprintf_ex( bufor, font, 10, 10, - 1, 255, "fps: %i", fps ); blit( bufor, screen, 0, 0, 0, 0, X, Y ); } destroy_bitmap( bufor ); deinit(); return 0; } END_OF_MAIN()
void init() { int depth, res; allegro_init(); depth = desktop_color_depth(); if( depth == 0 ) depth = 32; set_color_depth( depth ); res = set_gfx_mode( GFX_AUTODETECT, X, Y, 0, 0 ); if( res != 0 ) { allegro_message( allegro_error ); exit( - 1 ); } install_timer(); install_keyboard(); install_mouse(); install_int_ex( FramesPerSecond, BPS_TO_TIMER( 1 ) ); install_int_ex( increment_SpeedStatku, BPS_TO_TIMER( 500 ) ); install_int_ex( increment_TimerCooldown, BPS_TO_TIMER( 1000 ) ); install_int_ex( increment_SpeedSrollowaniaMapy, BPS_TO_TIMER( 50 ) ); install_int_ex( increment_SpeedPocisku, BPS_TO_TIMER( 1000 ) ); }
void deinit() { clear_keybuf(); allegro_exit(); }
Fakt, kod może jest trochę niepoprawnie napisany, i muli procesor, ale optymalizacja zajmę się jak już poskładam to co chce mieć =) Kłopot w tym ze, wyświetlana mapa jest trochę jakby kopnięta, im niżej ma wyświetlać tym bardziej ja przesuwa w prawo. Proszę o pomoc, mecze sie nad tym od wczorajszego wieczora. |