Ju1ian Temat założony przez niniejszego użytkownika |
» 2008-04-17 19:18:11 1. Nie wiem, bo to kod EasyKodera: bool kolizja( float x1, float y1, float s1, float 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; };
if( kolizja( ludek_x, ludek_y, ludek->w, ludek->h, platfa_x, platfa_y, platfa->h, platfa->w ) == true ) { ludek_y = platfa_y - 110; } 2. Oto kod: if( key[ KEY_UP ] || key[ KEY_SPACE ] ) if( ludek_y == klocki_y ) ludek_ruch_y =- 10;
ludek_x += ludek_ruch_x; ludek_y += ludek_ruch_y;
if( ludek_ruch_x > 0.1 ) ludek_ruch_x -= 0.5; else if( ludek_ruch_x <- 0.1 ) ludek_ruch_x += 0.5; else ludek_ruch_x = 0; if( ludek_y < 270 ) { ludek_ruch_y += 0.3; } if( ludek_y > klocki_y ) { ludek_y = klocki_y; } 3. Nie, tego problemu nie mam rozwiązanego. Dziękuję za odpowiedź. |
|
DejaVu |
» 2008-04-17 20:07:46 Ad 1. Ostatnie dwa parametry funkcji są w złej kolejności Ad 3. if(( key[ KEY_UP ] || key[ KEY_SPACE ] ) &&( ludek_y == klocki_y ) ) ludek_ruch_y =- 10;
ludek_y += ludek_ruch_y; if(( ludek_y - ludek_ruch_y >= klocki_y ) &&( ludek_y <= klocki_y ) ) { ludek_ruch_y = 0; ludek_y = klocki_y; } else { ludek_ruch_y += 0.3; }
Nie wiem jak masz cały program zbudowany i jak masz zapewnioną obsługę klocków na różnej wysokości... w każdym razie może to wyglądać mniej więcej tak, jak napisałem to powyżej. |
|
Ju1ian Temat założony przez niniejszego użytkownika |
» 2008-04-17 21:35:02 Niestety to nie działa ;/ |
|
DejaVu |
» 2008-04-18 00:15:52 To daj pełny kod - koło 18 zobaczę co trzeba poprawić. |
|
Ju1ian Temat założony przez niniejszego użytkownika |
» 2008-04-18 14:02:13 Oto kod: bool kolizja( float x1, float y1, float s1, float w1, int x2, int y2, int w2, int s2 ) { 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; };
#include <allegro.h>
int main() { allegro_init(); install_keyboard(); set_color_depth( 16 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0 ); BITMAP * klocki = NULL; BITMAP * niebo = NULL; BITMAP * ludek = NULL; BITMAP * bufor = NULL; BITMAP * platfa = NULL; int zycie = 100; bufor = load_bmp( "data/gfx/bufor.bmp", default_palette ); if( !bufor ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "Nie moge utworzyc bufora !" ); allegro_exit(); return 0; } klocki = load_bmp( "data/gfx/klocki.bmp", default_palette ); ludek = load_bmp( "data/gfx/ludek.bmp", default_palette ); niebo = load_bmp( "data/gfx/niebo.bmp", default_palette ); platfa = load_bmp( "data/gfx/platforma.bmp", default_palette ); if( !ludek ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "Nie moge zaladowac obrazka Ludek !" ); allegro_exit(); return 0; } int klocki_x = 0, klocki_y = 270; int platfa_x = 50, platfa_y = 250; float ludek_ruch_y; float a = 5, b = 2; int drzewko_x = 620, drzewko_y = 240; int niebo_x = 0, niebo_y = 0; float ludek_y = 270, ludek_x = 100; textprintf_ex( klocki, font, 20, 20, makecol( 0, 0, 0 ), - 1, "Zycie: %d", zycie ); while( !key[ KEY_ESC ] ) { if( zycie == 0 ) { allegro_message( "Przegrałes! Walnales sie o przeszkode i masz 0 punktow zycia ;)" ); allegro_exit(); return 0; } if( key[ KEY_RIGHT ] ) { ludek_x += 2; } if( key[ KEY_LEFT ] ) { ludek_x -= 2; } if(( key[ KEY_UP ] || key[ KEY_SPACE ] ) &&( ludek_y == klocki_y || ludek_y == platfa_y - 110 ) ) ludek_ruch_y =- 10; ludek_y += ludek_ruch_y; if(( ludek_y - ludek_ruch_y >= klocki_y ) &&( ludek_y <= klocki_y ) ) { ludek_ruch_y = 0; ludek_y = klocki_y; } else if( key[ KEY_UP ] ) { ludek_ruch_y += 0.3; ludek_y += ludek_ruch_y; } if( ludek_y < 270 &&( kolizja( ludek_x, ludek_y, ludek->w, ludek->h, platfa_x, platfa_y, platfa->h, platfa->w ) == true ) ) { ludek_y = platfa_y - 110; } if( ludek_x == 640 ) { ludek_x = 0; } rest( 10 ); clear_to_color( bufor, makecol( 150, 255, 0 ) ); blit( niebo, bufor, 0, 0, niebo_x, niebo_y, niebo->w, niebo->h ); masked_blit( platfa, bufor, 0, 0, platfa_x, platfa_y, platfa->w, platfa->h ); masked_blit( klocki, bufor, 0, 0, klocki_x, klocki_y, klocki->w, klocki->h ); masked_blit( ludek, bufor, 0, 0, ludek_x, ludek_y, ludek->w, ludek->h ); blit( bufor, screen, 0, 0, 0, 0, 640, 480 ); } if( key[ KEY_ESC ] ) { allegro_message( "No dobra..." ); } destroy_bitmap( klocki ); destroy_bitmap( niebo ); destroy_bitmap( ludek ); destroy_bitmap( bufor ); allegro_exit(); return 0; } END_OF_MAIN();
Dziękuję Ci bardzo, że poświęcasz dla mnie swój czas. |
|
DejaVu |
» 2008-04-18 17:44:33 Poprawienie inicjacji: Poprawić obsługę osi Y w pętli:
if(( key[ KEY_UP ] || key[ KEY_SPACE ] ) &&( ludek_y == klocki_y ) ) ludek_ruch_y =- 10;
ludek_y += ludek_ruch_y; if(( ludek_y + ludek_ruch_y >= klocki_y ) &&( ludek_y <= klocki_y ) ) { ludek_ruch_y = 0; ludek_y = klocki_y; } else { ludek_ruch_y += 0.3; }
|
|
Ju1ian Temat założony przez niniejszego użytkownika |
» 2008-04-18 19:48:34 |
|
DejaVu |
» 2008-04-19 12:29:47 Tak... ten algorytm kolizji co obecnie masz coś dziwnie działa. Zaraz go poprawię. |
|
1 « 2 » 3 4 |