inny1997 Temat założony przez niniejszego użytkownika |
znowu błąd segmentecji » 2010-09-01 14:40:42 napisałem gre testową, która ma sprawdzić moje rozwiązania związane z grawitacjią , kolizjiami oraz sterowanie całość zorientowana obiektowo oto kod #include<iostream> #include<allegro.h> #include<math.h>
class gra { public: gra() { allegro_init(); install_timer(); install_keyboard(); set_color_depth( 16 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 ); }; ~gra() { allegro_exit(); } };
class kolizje { public: int prawo_x_ob; int dol_y_ob; int x; int y; BITMAP * mapa; BITMAP * kula; kolizje() { mapa = load_bmp( "mapa.bmp", default_palette ); kula = load_bmp( "kula.bmp", default_palette ); x = 100; y = 100; prawo_x_ob = kula->w + x; dol_y_ob = kula->h + y; } ~kolizje() { destroy_bitmap( mapa ); destroy_bitmap( kula ); } int spr_kolizji_gora(); int spr_kolizji_prawo(); int spr_kolizji_dol(); int spr_kolizji_lewo(); };
int kolizje::spr_kolizji_gora() { if( getpixel( mapa, prawo_x_ob, y ) != makecol( 255, 0, 255 ) || getpixel( mapa, x, y ) != makecol( 255, 0, 255 ) || getpixel( mapa,( x + prawo_x_ob ) / 2, y ) != makecol( 255, 0, 255 ) ) { return( true ); } else { return( false ); } };
int kolizje::spr_kolizji_prawo() { if( getpixel( mapa, prawo_x_ob, y ) != makecol( 255, 0, 255 ) || getpixel( mapa, prawo_x_ob, dol_y_ob ) != makecol( 255, 0, 255 ) || getpixel( mapa, prawo_x_ob,( dol_y_ob + y ) / 2 ) != makecol( 255, 0, 255 ) ) { return( true ); } else { return( false ); } };
int kolizje::spr_kolizji_dol() { if( getpixel( mapa, prawo_x_ob, dol_y_ob ) != makecol( 255, 0, 255 ) || getpixel( mapa, x, dol_y_ob ) != makecol( 255, 0, 255 ) || getpixel( mapa,( x + prawo_x_ob ) / 2, dol_y_ob ) != makecol( 255, 0, 255 ) ) { return( true ); } else { return( false ); } };
int kolizje::spr_kolizji_lewo() { if( getpixel( mapa, x, dol_y_ob ) != makecol( 255, 0, 255 ) || getpixel( mapa, x, y ) != makecol( 255, 0, 255 ) || getpixel( mapa, x,( y + dol_y_ob ) / 2 ) != makecol( 255, 0, 255 ) ) { return( true ); } else { return( false ); } }
class wyswietlanie { public: kolizje * kol_wys; BITMAP * kula; BITMAP * bufor; BITMAP * tlo; BITMAP * ziemia; BITMAP * trawa; wyswietlanie() { kol_wys = new kolizje; ziemia = load_bmp( "ziemia.bmp", default_palette ); trawa = load_bmp( "trawa.bmp", default_palette ); kula = load_bmp( "kula.bmp", default_palette ); tlo = load_bmp( "tlo.bmp", default_palette ); bufor = create_bitmap( 800, 600 ); } ~wyswietlanie() { destroy_bitmap( kula ); destroy_bitmap( bufor ); destroy_bitmap( tlo ); destroy_bitmap( ziemia ); destroy_bitmap( trawa ); delete kol_wys; } void wyswietl(); };
void wyswietlanie::wyswietl() { masked_blit( kula, bufor, 0, 0, kol_wys->x, kol_wys->y, kula->h, kula->w ); blit( tlo, bufor, 0, 0, 0, 0, tlo->h, tlo->w ); blit( ziemia, bufor, 0, 0, 600 -( ziemia->h ), 0, ziemia->h, ziemia->w ); blit( trawa, bufor, 0, 0, 600 -( ziemia->h + trawa->h ), 0, ziemia->h, trawa->w ); };
class sterowanie { public: kolizje * kol_ste; bool lewo(); bool prawo(); bool skok(); sterowanie() { kol_ste = new kolizje; }; ~sterowanie() { delete kol_ste; }; };
bool sterowanie::lewo() { if( key[ KEY_LEFT ] &&!kol_ste->spr_kolizji_lewo() ) { kol_ste->x--; return( true ); } else { return( false ); } };
bool sterowanie::prawo() { if( key[ KEY_RIGHT ] &&!kol_ste->spr_kolizji_prawo() ) { kol_ste->x++; return( true ); } else { return( false ); } };
bool sterowanie::skok() { if( key[ KEY_UP ] && kol_ste->spr_kolizji_dol() ) { return true; } else { return false; } };
class grawitacja { private: kolizje * wyk_kol; sterowanie * ster; float t0; float t1; float v1; float v0; float a; float b; float n; public: grawitacja() { wyk_kol = new kolizje; ster = new sterowanie; t0 = 0; t1 = 0, 1; v1 = 40; v0 = 0; a = 10; b = 0; n = 0; } ~grawitacja() { delete ster; delete wyk_kol; } int graw(); };
int grawitacja::graw() { if( ster->skok() ) { v0 = v1; } else { v0 = 0; } n =( v0 * t0 -( a *( t0 * t0 ) ) / 2 ) - b; wyk_kol->y = wyk_kol->y +( static_cast < int >( round( n ) ) ); b = v0 * t0 -( a *( t0 * t0 ) ) / 2; t0 = t0 + t1; if( wyk_kol->spr_kolizji_dol() && n < 0 ) { while( n < 0 ) { n++; wyk_kol->y--; if( !wyk_kol->spr_kolizji_dol() ) { wyk_kol->y++; n = 0; } } } }; volatile long pre = 0; void inc_pre() { pre++; } END_OF_FUNCTION( inc_pre );
LOCK_VARIABLE( pre ); LOCK_FUNCTION( inc_pre );
int main() { gra game; grawitacja ruch; kolizje mapa1; sterowanie klawisze; wyswietlanie obraz; int t2 = 10; install_int_ex( inc_pre, BPS_TO_TIMER( 100 ) ); while( key[ KEY_A ] ) { obraz.wyswietl(); mapa1.spr_kolizji_dol(); mapa1.spr_kolizji_gora(); mapa1.spr_kolizji_lewo(); mapa1.spr_kolizji_prawo(); klawisze.lewo(); klawisze.prawo(); klawisze.skok(); if( pre % t2 < 6 ) { ruch.graw(); } } ruch.~grawitacja(); mapa1.~kolizje(); klawisze.~sterowanie(); obraz.~wyswietlanie(); game.~gra(); remove_int( inc_pre ); return 0; } END_OF_MAIN()
niestety kod się kompiluje, ale nie chce działać i dowiedziałem się że jest błąd sgmentacji |