Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Kolizja okrąg-okrąg dla ruchomych obiektów

Ostatnio zmodyfikowano 2011-06-19 19:26
Autor Wiadomość
Ju1ian
Temat założony przez niniejszego użytkownika
Kolizja okrąg-okrąg dla ruchomych obiektów
» 2011-06-19 16:39:50
Witam! Tworzę od jakiegoś czasu shooterek top-down. Napisałem funkcję sprawdzającą, czy zachodzi kolizja i niedopuszczającą do wejścia obiektu w obiekt. Przy kolizji ruchomy_obiekt - statyczny_obiekt, wszystko działa ok, ale gdy oba obiekty się poruszają (w moim przypadku mob i player) to one dziwnie się przepychają, a chciałbym żeby się blokowały i nikt nie mógł żadnego przepchać. Kod funkcji:

void CircleCollision(float &x, float ob_x, float &y, float ob_y, float r, float ob_r, float &x_d, float &y_d, float &d_l)
{
     ////////////////////////////////////////////////////////////////////
     ///////// KOLIzJA OKRĄG - OKRĄG        ////////////////////////////
     ///////////////////////////////////////////////////////////////////
    
     float temp_x , temp_y;
          
     if(sqrt((x - ob_x)*(x - ob_x) + (y - ob_y)*(y - ob_y))<=(r+ob_r))
     {
          temp_x = x + x_d ;
          temp_y = y + y_d ;
              
          x_d = temp_x - ob_x ;
          y_d = temp_y - ob_y ;
              
          // wydłużanie
          d_l = sqrt( x_d*x_d + y_d *y_d) ;
              
          x_d /= d_l ;
          y_d /= d_l ;
              
          x_d *= (ob_r + r) ;
          y_d *= (ob_r + r);
              
          x = ob_x + x_d ;
          y = ob_y + y_d ;                      
     }
}

Z góry dziękuję za pomoc.
P-34287
michalp
» 2011-06-19 16:48:44
Wyznacz wektor przesunięcia dla każdego okręgu dodając do niego wartość skalarną promienia a potem sprawdź czy mają punkt wspólny (inaczej czy wektory się przecinają).

edit: Sorki, teraz zobaczyłem, że trochę o co innego ci chodzi ;)
P-34289
Ju1ian
Temat założony przez niniejszego użytkownika
» 2011-06-19 16:55:22
Jak sprawdzić czy się przecinają? (sorry jestem noga)
P-34291
michalp
» 2011-06-19 17:00:50
P-34294
Ju1ian
Temat założony przez niniejszego użytkownika
» 2011-06-19 17:16:42
Hmm... Chyba źle mnie zrozumiałeś. Chodzi mi o to, aby gdy potworki się napotkają to, żeby siebie nie przepychały, a ślizgały się (jeżeli wektory nie są prostopadłe do nich) i blokowały się (jeżeli są prostopadłe do nich). Ten kod który podałem tak nie działa, i w dodatku, gdy do playera biegną 3 zombiaki naraz to, gdy one się ze sobą spotkają to dziwnie przeskakują.
P-34297
absflg
» 2011-06-19 17:41:08
Żeby sprawdzić czy dwa koła na siebie nachodzą, sprawdź czy odległość między ich środkami jest mniejsza od sumy ich promieni. Jeżeli obiekty wariują to wyznaczaj im ścieżki tak, by nie kolidowały ze sobą, a nie pchały się do gracza w linii prostej.
P-34300
Ju1ian
Temat założony przez niniejszego użytkownika
» 2011-06-19 18:46:53
Chłopie, chyba nie przeczytałeś mojego pierwszego posta. Samo sprawdzanie jest dobre, tylko chodzi o odpowiednie przesunięcie obu obiektów, tak aby one się nie przemieszczały.
EDIT:
Samo założenie gry jest takie, że potwory idą do mnie w linii prostej, więc tego nie będę zmieniał.
P-34308
kamillo121
» 2011-06-19 19:18:55

 tylko chodzi o odpowiednie przesunięcie obu obiektów, tak aby one się nie przemieszczały.

Wnioskując z tego zdania i pierwszego postu po prostu mają się blokować a nie wariować.
Po prostu jeżeli wektor okręgu nachodzi na drugi okrąg to skróci ten wektor o tyle o ile nachodzi na ten drugi okrąg, wtedy się zablokuje.
P-34316
« 1 » 2
  Strona 1 z 2 Następna strona