maciek1316 Temat założony przez niniejszego użytkownika |
[Allegro] - Kolizje okręgów » 2008-04-10 20:56:59 Chciał bym zrobic tak tutaj okrąg(wogule jaka kolwiek figura czy obrazek) wchodząc na drugi powodował zakończenie programu i wyświetlenie wiadomości"xxx". Chciałem zrobić małą gre (moją pierwsza :D) alemi nei wychodzi... próbowalem z różnymi pętlami i nici. Mógł by ktoś coś takiego napisać? Tu jest jedna z prób.Tylko ze jak okrąg wchodzi na okrąg to nic sie nie dzieje... dopiero jak wyjdzie poza ekran.. #include <allegro.h> #include <iostream> #include <conio.h> using namespace std; int main() { allegro_init(); install_keyboard(); set_color_depth( 16 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 ); clear_to_color( screen, makecol( 46, 54, 140 ) ); int ludek_x = 50, ludek_y = 100; int ludek1_x = 150, ludek1_y = 150; circle( screen, ludek_x, ludek_y, 50, makecol( 43, 0, 255 ) ); do { if( key[ KEY_A ] ) { ludek1_x--; } if( key[ KEY_D ] ) { ludek1_x++; } if( key[ KEY_W ] ) { ludek1_y--; } if( key[ KEY_S ] ) { ludek1_y++; } rest( 1 ); circle( screen, ludek1_x, ludek1_y, 50, makecol( 255, 111, 64 ) ); } while(( ludek_x = ludek1_x ) &&( ludek_y = ludek1_y ) ); textout_ex( screen, font, "xxx", 20, 20, makecol( 255, 0, 255 ), - 1 ); while( !key[ KEY_ESC ] ); readkey(); allegro_exit(); return( 0 ); } END_OF_MAIN();
|
|
dudek |
» 2008-04-10 22:31:39 Nie dziala, gdyz kolizje nie sa takie proste:) ciezka figure se wybrales jak na pierwsze proby:) podstawowy blad to warunki sprawdza sie za pomoca "==" a nie "=" (to jest przyisanie wartosci:)) O to bardzo niedokladna i przykladowa petla, podczas ktorej sprawdzana jest kolizja tych dwoch okregow: bool kolizja = false; do { if( key[ KEY_A ] ) { ludek1_x--; } if( key[ KEY_D ] ) { ludek1_x++; } if( key[ KEY_W ] ) { ludek1_y--; } if( key[ KEY_S ] ) { ludek1_y++; } rest( 1 ); if(( ludek1_x - 50 <= ludek_x + 40 ) &&( ludek1_x + 50 >= ludek_x - 40 ) &&( ludek1_y - 50 <= ludek_y + 40 ) &&( ludek1_y + 50 >= ludek_y - 40 ) ) kolizja = true; circle( screen, ludek1_x, ludek1_y, 50, makecol( 255, 111, 64 ) ); } while( kolizja == false );
Kolizje najprosciej liczyc na prostokatach, tzn. trzeba wyobrazic sobie niewidzialny prostokat otaczajacy okrag i na jego wspolrzednych obliczac kolizje. Kolizje dwoch prostokatow nastepuja gdy jeden z wierzcholkow prostokata znajdzie sie wewnatrz drugiego (albo na jego boku) :) To co Ci naskrobalem na kolanie to tylko prosty przyklad. Generalnie z okregami jest ciezej bo prostokat bardzo zmniejsza dokladnosc takich kolizji gdyz przy jego wierzcholkach jest sporo miejsca, ktory nie nalezy do okregu a bedzie liczony jako "jego czesc" przy takiej metodzie sprawdzania. Z kolizjami w grach zawsze trzeba pokombinowac i zawsze wszystko mozna zrobic lepiej:P |
|
DejaVu |
Kolizje okręgów » 2008-04-10 22:48:38 Kolizje dwóch okręgów są banalne :) Liczysz odległość między środkami dwóch okręgów i porównujesz z sumą promieni obu tych okręgów. Jeśli odległość punktów jest mniejsza niż suma promieni tych okręgów, to okręgi kolidują ze sobą. |
|
dudek |
» 2008-04-10 23:25:16 No to prawda ale jednak mysle, ze lepiej zaczac od prostokatow. Moze dlatego, ze sam napoczatku tylko prostokatami sie bawilem? W kazdym razie masz racje:) // No to niech w kodzie, ktory wyslalem mu wczesniej zamieni linijke sprawdzajaca kolizje na prostokatach na: if(( sqrt( pow( ludek1_x - ludek_x, 2 ) + pow( ludek1_y - ludek_y, 2 ) ) ) < 100 ) kolizja = true;
|
|
DejaVu |
Pierwiastek a moc obliczeniowa » 2008-04-11 12:57:03 Unikaj używania pierwiastka bez potrzeby. Operacja pierwiastkowania zużywa znacznie więcej mocy obliczeniowej procesora niż mnożenie. Lepiej więc podnieść prawą stronę równania do potęgi drugiej, niż wyciągać pierwiastek z lewej strony równania. |
|
maciek1316 Temat założony przez niniejszego użytkownika |
» 2008-04-11 15:48:58 Dzięki Wielkie |
|
« 1 » |