lucky44 Temat założony przez niniejszego użytkownika |
Zderzenie 2 kulek w jednej płaszczyźnie (oś współrzędnych x) » 2011-06-05 20:46:16 Witam mam pytanie, mam 2 kulki startują z określonego punktu x i wysokości y. Jedna zmierza z lewej strony do prawej, a druga z prawej do lewej. Aż w końcu się spotykają. Odbijają się od ścianek okienka programu (prawa i lewa strona) i teraz moje pytanie jak zrobić żeby zamiast nakładać się i swobodnie przelatywać przez siebie, one się odbiły. Pomyślałem o jednym zrobiłem warunek if - if(x==a+40) { --x; ++a }
x- współrzędna osi x kuli 1 a- współrzędna osi x kuli 2 dałem x==a+40 dlatego że kolizja występuje w momencie tylko zetknięcia się ze sobą, a nie nałożenia 40 to promień mojej kuli. Podany kod, warunek jednak robi się tak że kule stają zetknięte ze sobą a nie jak powinno wynikać z kodu że kule mają efekt odbicia. Proszę o pomoc, dziękuje z góry za odpowiedź i pozdrawiam forumowiczów. Dodam, że korzystam z biblioteki Allegro. |
|
npHard |
» 2011-06-05 21:33:48 Robiąc --x i a++ zmieniasz tylko pozycję kulek, nie zmieniasz kierunku w którym się poruszają. Nie znam całego kodu ale pewnie masz jakieś zmienne, które decydują o kierunku poruszania się kulek. W tym ifie musisz zmodyfikować te zmienne. |
|
lucky44 Temat założony przez niniejszego użytkownika |
» 2011-06-05 21:48:35 #include <allegro.h> #include <cstdlib> int x=590; int y=250;
int tempX=450; int tempY=100;
int dir=1;
void movecircle()
{ tempX = x; tempY = y; if(dir == 1 && x !=20 && y !=20) { --x; } else if(dir == 2 && x!=620 && y!= 20 ) { ++x; } else { dir = rand() % 4 + 1; }
acquire_screen(); circlefill(screen,tempX,tempY,20,makecol(0,0,0)); circlefill(screen,x,y,20,makecol(128,225,0)); release_screen();
rest(10); } // 2 kulka
int a=40; int b=250;
int tempa=200; int tempb=100;
int dirb=1;
void moveCircle()
{ tempa = a; tempb = b; if(dirb == 1 && a !=620 && b !=20) { ++a; } else if(dirb == 2 && a!=20 && b!=20 ) { --a; } else
{ dirb = rand() % 4 + 1; }
acquire_screen(); circlefill(screen,tempa,tempb,20,makecol(0,0,0)); circlefill(screen,a,b,20,makecol(0,0,255)); release_screen();
rest(10);
if(x==a+40) {++x; --a; } }
int main() { allegro_init(); install_keyboard(); set_color_depth(16); set_gfx_mode(GFX_AUTODETECT_WINDOWED,640,480,0,0); while( !key[KEY_ESC]) { movecircle(); moveCircle(); } return 0; } END_OF_MAIN()
Zamieszczam cały kod, przepraszam że nie zrobiłem tego od razu. Dziękuje za odpowiedź będę cały czas kombinował. Jeżeli ktoś ma pomysł żeby zmodyfikować to proszę mi napisać, ale nie wiem bo narazie jak zaczarowane stoją w miejscu. :( |
|
szyx_yankez |
» 2011-06-05 22:20:58 Zainteresuj się jakąś biblioteką do obsługi fizyki np. Box2D. |
|
lucky44 Temat założony przez niniejszego użytkownika |
» 2011-06-05 22:24:06 A czy można zrobić to bez użycia takiej biblioteki? Czy jest konieczne? |
|
szyx_yankez |
» 2011-06-05 22:44:05 Oczywiście, wykorzystując wiedzę z fizyki z klasy 1 gimnazjum.
Lub na "chama" np. tak:
int x1 = 0; int x2 = 800; int d = 15; int center =( x1 + x2 ) / 2; bool Dir = true;
if( Dir ) { x1++; x2--; if( x1 == center - d ) Dir = false; } else { x1--; x2++; if( x1 == 0 ) Dir = true; }
|
|
« 1 » |