Trust Temat założony przez niniejszego użytkownika |
Obliczanie wierzchołków na obiekcie, warunek odpowiadający za kolizję. » 2012-05-02 02:15:12 Witam !!! tym razem chodzi o kolizje. Niżej kawałek kodu, który odpowiada za obliczanie wierzchołków samochodu nr. 1 i nr. 2 :
int kx1 = 0, ky2 = 0, kx3 = 0, ky4 = 0, kx5 = 0, ky6 = 0;
kx1 = 52 + s1_y; ky2 = s1_x + 0;
kx3 = 41 + s1_x; ky4 = s1_y + 0;
kx5 = s1_x + 41; ky6 = s1_y + 52;
int kx7 = 0, ky8 = 0, kx9 = 0, ky10 = 0, kx11 = 0, ky12 = 0;
kx7 = 52 + s2_y; ky8 = s2_x + 0;
kx9 = 41 + s2_x; ky10 = s2_y + 0;
kx11 = s2_x + 41; ky12 = s2_y + 52;
Wymiary obrazka to ( czyli samochodu 1 i 2 ) to 41x52. Zmienne s1_x,s1_y,s2_x,s2_y to współrzędne początkowe na jakich są ustawione samochody. I gdy przechodzę do pętli warunkowej np: if(( kx1, ky2 ) =( kx9, ky10 ) ) { s2_x - 10; kx1 - 10; }
lub if(( kx1, ky2 ) >=( kx9, ky10 ) ) { s2_x - 10; kx1 - 10; }
...która ma sprawdzać czy samochód 1(lewy dolny róg) styka się z samochodem 2 (prawy górny róg) w ogóle nie reaguje tzn. samochód 1 nie jest cofnięty na osi x o 10 pikseli. I tu pytanie dlaczego ? Przecież to jest TYLKO jeden warunek i nic, zero reakcji. Głowię się nad tym już z 3-4 godz. dlatego proszę o pomoc:) A tu cały kod: #include <allegro.h>
volatile long speed = 0; void increment_speed() { speed++; } END_OF_FUNCTION( increment_speed ); LOCK_VARIABLE( speed ); LOCK_FUNCTION( increment_speed );
int main() { allegro_init(); install_keyboard(); set_color_depth( 32 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 880, 686, 0, 0 ); install_timer(); install_int_ex( increment_speed, BPS_TO_TIMER( 150 ) ); BITMAP * buffer = create_bitmap( 880, 686 ); clear_to_color( buffer, 0x333333 ); install_sound( DIGI_AUTODETECT, MIDI_AUTODETECT, "" ); set_volume( 255, 255 ); BITMAP * s1 = NULL; BITMAP * s2 = NULL; BITMAP * MAPA = NULL; BITMAP * bufor = NULL; BITMAP * start = NULL; BITMAP * choinki = NULL; BITMAP * barierki = NULL; SAMPLE * dzwiek = NULL; SAMPLE * dzwiek1 = NULL; bufor = create_bitmap( 880, 686 ); if( !bufor ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "Nie mogę utworzyć bufora !" ); allegro_exit(); return 0; } MAPA = load_bmp( "mapy/MAPA.bmp", default_palette ); if( !MAPA ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "Nie mogę utworzyć mapy !" ); allegro_exit(); return 0; } s1 = load_bmp( "samochody/s1.bmp", default_palette ); if( !s1 ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka s1 !" ); allegro_exit(); return 0; } s2 = load_bmp( "samochody/s2.bmp", default_palette ); if( !s2 ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka s2 !" ); allegro_exit(); return 0; } start = load_bmp( "start.bmp", default_palette ); if( !start ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka start !" ); allegro_exit(); return 0; } choinki = load_bmp( "elementy_do_mapy/choinki.bmp", default_palette ); if( !choinki ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka choinki !" ); allegro_exit(); return 0; } barierki = load_bmp( "elementy_do_mapy/barierki.bmp", default_palette ); if( !barierki ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka barierki !" ); allegro_exit(); return 0; } dzwiek = load_sample( "dzwieki/warkot1.wav" ); if( !dzwiek ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować dzwieku !" ); allegro_exit(); return 0; } dzwiek1 = load_sample( "dzwieki/dzwiek1.wav" ); if( !dzwiek ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować dzwieku1 !" ); allegro_exit(); return 0; } int s1_x = 130, s1_y = 400, s2_x = 80, s2_y = 400; play_sample( dzwiek1, 12, 12, 1000, 0 ); while( !key[ KEY_ESC ] ) { while( speed > 0 ) { if( key[ KEY_LEFT ] ) { adjust_sample( dzwiek, 255, 127, 300, 0 ); s1_x--; } if( key[ KEY_RIGHT ] ) { adjust_sample( dzwiek, 255, 255, 1000, 0 ); s1_x++; } if( key[ KEY_UP ] ) { adjust_sample( dzwiek, 255, 255, 1000, 0 ); s1_y--; } if( key[ KEY_DOWN ] ) { adjust_sample( dzwiek, 255, 255, 1000, 0 ); s1_y++; } if( key[ KEY_A ] ) s2_x--; if( key[ KEY_D ] ) s2_x++; if( key[ KEY_W ] ) s2_y--; if( key[ KEY_S ] ) s2_y++; speed--; } clear_to_color( bufor, makecol( 150, 150, 150 ) ); blit( MAPA, bufor, 0, 0, 0, 0, MAPA->w, MAPA->h ); blit( start, bufor, 20, 6, 40, 362, start->w, start->h ); blit( barierki, bufor, 0, 0, 120, 112, barierki->w, barierki->h ); masked_blit( s1, bufor, 0, 0, s1_x, s1_y, s1->w, s1->h ); masked_blit( s2, bufor, 0, 0, s2_x, s2_y, s2->w, s2->h ); blit( bufor, screen, 0, 0, 0, 0, 880, 686 ); if( s1_x <=- 1 ) { s1_x = 9; } if( s1_x >= 840 ) { s1_x = 830; } if( s1_y >= 635 ) { s1_y = 625; } if( s1_y <=- 1 ) { s1_y = 9; } if( s2_x <=- 1 ) { s2_x = 9; } if( s2_x >= 840 ) { s2_x = 830; } if( s2_y >= 635 ) { s2_y = 625; } if( s2_y <=- 1 ) { s2_y = 9; } int kx1 = 0, ky2 = 0, kx3 = 0, ky4 = 0, kx5 = 0, ky6 = 0; kx1 = 52 + s1_y; ky2 = s1_x + 0; kx3 = 41 + s1_x; ky4 = s1_y + 0; kx5 = s1_x + 41; ky6 = s1_y + 52; int kx7 = 0, ky8 = 0, kx9 = 0, ky10 = 0, kx11 = 0, ky12 = 0; kx7 = 52 + s2_y; ky8 = s2_x + 0; kx9 = 41 + s2_x; ky10 = s2_y + 0; kx11 = s2_x + 41; ky12 = s2_y + 52; if(( kx1, ky2 ) >=( kx9, ky10 ) ) { kx1 - 10; } } remove_int( increment_speed ); destroy_bitmap( bufor ); destroy_bitmap( MAPA ); destroy_bitmap( start ); destroy_bitmap( s1 ); destroy_bitmap( s2 ); readkey(); destroy_bitmap( buffer ); return 0; } END_OF_MAIN();
|
|
szyx_yankez |
» 2012-05-02 08:00:18 Tobie chodzi o zwykłą kolizje 2 prostokątów. Było już mnóstwo tematów o tym.
|
|
Trust Temat założony przez niniejszego użytkownika |
» 2012-05-02 10:13:10 Czytam i nic nie wiem. A czy mój pomysł jest dobry ? I czemu ten warunek nie działa ? Poniższy kod powinien zadziałać w chwili gdy samochodem 1 wjeżdżamy za tył samochodu 2. I w momencie gdy samochód 1 dotyka przodem tyłu samochodu 2 to samochód 1 powinien się cofnąć po osi y o -10. Oczywiście nie działa, a jest chyba dobrze napisany. if(( kx9, ky10 ) >=( kx7, ky8 ) &&( kx11, ky12 ) >=( kx3, ky4 ) ) { ky8 - 10; }
|
|
Trust Temat założony przez niniejszego użytkownika |
» 2012-05-03 00:15:21 Metodą prób i błędów doszedłem do tego,ze 3 czy 4 wierzchołki żle się obliczały. błąd poprawiony. Zrobiłem kolizję która na razie odnosi się tylko do prawego boku samochodu nr 2 oraz jego tyłu. Kolizję działają tak na "styk". Jeżeli chcę dodać to warunku ,ze jeżeli samochod 1 dotyka samochodu 2 lewym bokiem i samochod 1 odsunie się od niego np o 5 px. w prawo to jak to zapisac ? Bo tak : ani tak : kx2 + 10; kx3 + 10; kx5 + 10; kx7 + 10;
nie działa. niżej część kodu odpowiadająca za kolizję:
kx2 = s1_x; ky1 = 52 + s1_y;
kx3 = 41 + s1_x; ky4 = s1_y;
kx5 = s1_x + 41; ky6 = s1_y + 52;
kx7 = s1_x; ky8 = s1_y;
ky10 = 52 + s2_y; kx9 = s2_x;
kx11 = 41 + s2_x; ky12 = s2_y;
kx13 = s2_x + 41; ky14 = s2_y + 52;
kx15 = s2_x; ky16 = s2_y;
textprintf_ex( screen, font, 10, 10, makecol( 255, 255, 255 ), - 1, "ky1: %d", ky1 ); textprintf_ex( screen, font, 10, 20, makecol( 255, 255, 255 ), - 1, "kx2: %d", kx2 ); textprintf_ex( screen, font, 10, 30, makecol( 255, 255, 255 ), - 1, "kx3: %d", kx3 ); textprintf_ex( screen, font, 10, 40, makecol( 255, 255, 255 ), - 1, "ky4: %d", ky4 ); textprintf_ex( screen, font, 10, 50, makecol( 255, 255, 255 ), - 1, "kx5: %d", kx5 ); textprintf_ex( screen, font, 10, 60, makecol( 255, 255, 255 ), - 1, "ky6: %d", ky6 ); textprintf_ex( screen, font, 10, 70, makecol( 255, 255, 255 ), - 1, "kx7: %d", kx7 ); textprintf_ex( screen, font, 10, 80, makecol( 255, 255, 255 ), - 1, "ky8: %d", ky8 ); textprintf_ex( screen, font, 10, 90, makecol( 255, 255, 255 ), - 1, "kx9: %d", kx9 ); textprintf_ex( screen, font, 10, 100, makecol( 255, 255, 255 ), - 1, "ky10: %d", ky10 ); textprintf_ex( screen, font, 10, 110, makecol( 255, 255, 255 ), - 1, "kx11: %d", kx11 ); textprintf_ex( screen, font, 10, 120, makecol( 255, 255, 255 ), - 1, "ky12: %d", ky12 ); textprintf_ex( screen, font, 10, 130, makecol( 255, 255, 255 ), - 1, "kx13: %d", kx13 ); textprintf_ex( screen, font, 10, 140, makecol( 255, 255, 255 ), - 1, "ky14: %d", ky14 ); textprintf_ex( screen, font, 10, 150, makecol( 255, 255, 255 ), - 1, "kx15: %d", kx15 ); textprintf_ex( screen, font, 10, 160, makecol( 255, 255, 255 ), - 1, "ky16: %d", ky16 );
if( kx13 >= kx2 && kx11 >= kx7 && ky8 >= ky12 && ky14 >= ky1 ) { textout_ex( MAPA, font, "prawy bok auta 2 kolizja !", 0, 0, makecol( 255, 255, 255 ), - 1 ); s1_x - 10; }
if( ky8 >= ky10 && ky14 >= ky4 && kx7 >= kx9 && kx13 >= kx3 ) { textout_ex( MAPA, font, "tyl auta 2 Kolizja !", 250, 0, makecol( 255, 255, 255 ), - 1 ); s2_y - 10; }
|
|
akwes |
» 2012-05-03 00:21:57 kx2 + 10; kx3 + 10; kx5 + 10; kx7 + 10;
Hm... Nie przyglądałem się Twojemu kodowi... ale Try this shit: kx2 = kx2 + 10; kx3 = kx3 + 10; kx5 = kx5 + 10; kx7 = kx7 + 10;
or even this kx2 += 10; kx3 += 10; kx5 += 10; kx7 += 10;
W innych przypadkach też :P |
|
Trust Temat założony przez niniejszego użytkownika |
» 2012-05-03 00:28:12 Jeżeli tak nie działa to jak to zapisać ? |
|
akwes |
» 2012-05-03 00:31:08 Ten zapis nic nie zmienia. kx7 += 10;
kx7 = kx7 + 10;
Dopiero zmienia stan zmiennej. Jeżeli dalej nie działa, to jest więcej błędów. A widzę że kodzie masz mnóstwo takich zapisów. |
|
Trust Temat założony przez niniejszego użytkownika |
» 2012-05-03 00:37:41 Ale jak zapisze to tak: to powinno działać, a nie działa. Nizej przedstawiam funkcję która niepozwala obiektowi wychodzic poza ekran. jeżeli jest za blisko granicy(tam gdzie wychodzi poza ekran) to np: i ta funkcja działa, a ta od kolizji nie... a zasada działania jest poniekąd zbliżona. if( s1_x <=- 1 ) { s1_x = 9; } if( s1_x >= 840 ) { s1_x = 830; } if( s1_y >= 635 ) { s1_y = 625; } if( s1_y <=- 1 ) { s1_y = 9; } if( s2_x <=- 1 ) { s2_x = 9; } if( s2_x >= 840 ) { s2_x = 830; } if( s2_y >= 635 ) { s2_y = 625; } if( s2_y <=- 1 ) { s2_y = 9; }
|
|
« 1 » 2 3 |