dziadek94 Temat założony przez niniejszego użytkownika |
[Allegro] problem z kolizją ,działaniem klawiszy ,zły rozmiar obiektów , źle połorzony obiekt » 2012-06-23 17:45:46 Jest taki problem że gdy włączam grę ludek powinien chodzić po trawie o szerokości 250 i skakać po niej ,a spadać dopiero za trawą. Jest zupełnie inaczej bo chodzi kawałek po za trawą kawałek w trawie ,jeszcze kawałek nie da się skakać a jeszcze kawałek spada w dół ,proszę o pomoc :) cały kod: #include <iostream> #include <string> #include <cstdlib> #include <ctime> # include <fstream> #include <direct.h> #include <allegro.h>
volatile long speed = 0; bool kolizja( int x1, int y1, int s1, int w1, int x2, int y2, int s2, int w2 ) { if( x2 <= x1 + s1 && x2 > x1 && y2 >= y1 && y2 <= y1 + w1 ) return true; else if( x2 <= x1 + s1 && x2 > x1 && y2 + w2 >= y1 && y2 + w2 <= y1 + w1 ) return true; else if( x2 + s2 <= x1 + s1 && x2 + s2 > x1 && y2 >= y1 && y2 <= y1 + w1 ) return true; else if( x2 + s2 <= x1 + s1 && x2 + s2 > x1 && y2 + w2 >= y1 && y2 + w2 <= y1 + w1 ) return true; else return false; }; void increment_speed() { speed++; } END_OF_FUNCTION( increment_speed ); LOCK_VARIABLE( speed ); LOCK_FUNCTION( increment_speed ); class Cpostac { public: int x, y; short int kierunek, klatka; }; Cpostac ludeki;
int main() { allegro_init(); install_keyboard(); set_color_depth( 32 ); set_gfx_mode( GFX_AUTODETECT, 640, 480, 0, 0 ); install_timer(); install_int_ex( increment_speed, BPS_TO_TIMER( 100 ) ); clear_to_color( screen, makecol( 255, 0, 255 ) ); BITMAP * bufor = NULL; BITMAP * ludek = NULL; BITMAP * pod = NULL; BITMAP * tlo = NULL; int sz = 0; int wy = 0; int podsz = 0; int podwy = 0; int szpostaci = 50; int wypostaci = 50; 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; } tlo = load_bmp( "tlo1.bmp", default_palette ); pod = load_bmp( "trawa1.bmp", default_palette ); ludek = load_bmp( "heros.bmp", default_palette ); int frame = 0; ludeki.x = 320; ludeki.y = 200; ludeki.klatka = 0; ludeki.kierunek = 0; int skok = 50; int vspeed = 0; while( !key[ KEY_ESC ] ) { while( speed > 0 ) { ludeki.kierunek = 0; if( key[ KEY_LEFT ] && ludeki.x > 0 && kolizja( ludeki.x, ludeki.y, szpostaci, wypostaci, 320, 290, 250, 50 ) == false ) { ludeki.kierunek = 4; ludeki.x -= 2; sz -= 2; } if( key[ KEY_RIGHT ] && ludeki.x < 640 - 50 && kolizja( ludeki.x, ludeki.y, szpostaci, wypostaci, 320, 290, 250, 50 ) == false ) { ludeki.kierunek = 2; ludeki.x += 2; sz += 2; } if( key[ KEY_ALT ] ) { ludeki.y -= 20; wy -= 20; } if( key[ KEY_UP ] && kolizja( ludeki.x, ludeki.y, szpostaci, wypostaci, 320, 290, 250, 50 ) == true ) { skok = 0; ludeki.y -= 5; wy -= 5; } if( skok != 50 && kolizja( ludeki.x, ludeki.y, szpostaci, wypostaci, 320, 290, 250, 50 ) == false ) { ludeki.y -= 2; wy -= 2; skok += 1; } if( kolizja( ludeki.x, ludeki.y, szpostaci, wypostaci, 320, 290, 50, 50 ) == false && skok == 50 ) { ludeki.y += 2; wy = ludeki.y - 200; } if( key[ KEY_DOWN ] && ludeki.y < 480 - 50 && kolizja( ludeki.x, ludeki.y, szpostaci, wypostaci, 320, 290, 250, 50 ) == false ) { ludeki.kierunek = 3; ludeki.y += 2; wy += 2; } if( key[ KEY_LEFT ] && ludeki.x > 0 && kolizja( ludeki.x, ludeki.y, szpostaci, wypostaci, 320, 290, 250, 50 ) == true ) { ludeki.kierunek = 4; ludeki.x -= 2; sz -= 2; } if( key[ KEY_RIGHT ] && ludeki.x < 640 - 50 && kolizja( ludeki.x, ludeki.y, szpostaci, wypostaci, 320, 290, 250, 50 ) == true ) { ludeki.kierunek = 2; ludeki.x += 2; sz += 2; } if( key[ KEY_DOWN ] && ludeki.y < 480 - 50 && kolizja( ludeki.x, ludeki.y, szpostaci, wypostaci, 320, 290, 250, 50 ) == true ) { ludeki.kierunek = 3; ludeki.y -= 2; wy -= 2; } speed--; frame++; if( frame > 40 ) frame = 0; } clear_to_color( bufor, makecol( 150, 150, 150 ) ); kolizja( ludeki.x, ludeki.y, szpostaci, wypostaci, 320, 290, 250, 50 ); if( frame < 20 ) { ludeki.klatka = 0; } else if( frame >= 20 && frame < 40 ) { ludeki.klatka = 1; } masked_blit( tlo, bufor, 0, 0, 0, 0, 640, 480 ); masked_blit( ludek, bufor, ludeki.kierunek * 50, ludeki.klatka * 50, ludeki.x, ludeki.y, szpostaci, wypostaci ); masked_blit( pod, bufor, 0, 0, 320, 290, 250, 50 ); blit( bufor, screen, sz, wy, 0, 0, 640, 480 ); } remove_int( increment_speed ); destroy_bitmap( pod ); destroy_bitmap( ludek ); destroy_bitmap( bufor ); allegro_exit(); return 0; } END_OF_MAIN();
|