Niepoprawne kolizje obiektów

0

Siema!
Próbuję zrobić program który pozwoli animować ruch i zderzenia wirtualnych kul. Ogarnąłem jak zrobić przemieszczenia i kolizje ze ścianami ale od dłuższego czasu męczę się ze zderzeniami pomiędzy kulami. Czasem zderzenie wygląda poprawnie ale w większości przypadków dzieją się dziwne rzeczy jak zakleszczanie się kul.
Aby dodać kulę trzeba po prostu kliknąć w oknie, potem ruszając myszką i kręcąc kółkiem ustawić jej rozmiar, kierunek ruchu i szybkość, aby zatwierdzić kulę trzeba kliknąć jeszcze raz.
Klawisz esc działa jak Pausa. Każda kula jest poruszana w osobnym wątku.
Co do obliczeń to korzystałem z tej strony http://www.tarabuk.cba.pl/niecentralne.htm

To mój kod, wiem że prawdopodobnie całość woła o pomstę do nieba ale proszę o pomoc i wskazówki odnośnie nieprawidłowych zderzeń pomiędzy kulami
https://github.com/wazxse5/Kule.git

Jeśli masz chwilę to zerknij na kod, potrzebuję twojej pomocy :)

0

ok, wrzuciłem na githuba :)

0

tak szybkie spojrzenie, to Ci mówię od razu że nie masz żadnej komunikacji pomiędzy wątkami kulek a sprawdzającym, w związku z czym na pewno jakieś problemy z konkurencją następują.

Tak na szybko dałbym w wątek kul wait na wątek sprawdzania kolizji, i ruszał je dopiero jak zostanie sprawdzone czy nie ma żadnych kolizji. Ale to musisz pewnie przemyśleć architekture programu ;-)

0

W grach komputerowych najczęściej jest pętla główna:

While(true){
ruszaj()
sprawdz_kolizje()
odrysuj()
}

A z wątkami, jaką masz pewność, ze akurat jak masz 3 kule, to wątek jednej kuli nie "zje" pozostałych? (problem głodnych filozofów) - efekt może być taki, że jedna będzie się przemieszczać a pozostałe nie.

0

Zatrzymanie ruchu kul klawiszem ESC dotyczy tylko istniejących już kul. Jeśli w stanie wstrzymania dodasz nową kulę, to ona będzie się poruszać. W efekcie część kul może się poruszać, a część stać. Efekt zamierzony, czy usterka w kodzie?
Nieprzewidywalne jest odbijanie się kuli od ściany jeśli użytkownik zmienia rozmiar okna i ściana ucieka lub atakuje kulę. Może warto uniemożliwić zmianę rozmiaru okna (setResizable(false)).

0

co do tego zatrzymywania to rzeczywiście jest drobna usterka ale wystarczy parę linijek i będzie działać :)
a ze zmianą rozmiaru okna to właśnie o to chodzi żeby można było zmieniać wymiary a kule nadal zachowywały się poprawnie ( przynajmniej tak powinno być :D )

0

Przeanalizuj wpierw odbicia kół od ścian ruchomych - w Twoim programie działają one źle. A są znacznie prostsze do analizy od wzajemnego odbicia dwóch kół.
Przy okazji, w przypadku ścian nieruchomych kółka odbijają się od powietrza w pobliżu ściany, a nie od ściany. Zamiast

if (centX < (radius + 1)) wallCollision(Direction.WEST);

winno być

if (centX <= radius) wallCollision(Direction.WEST);

i analogicznie dla pozostałych ścian.

U Ciebie odbicie od dolnej ściany wygląda tak:

if (centY >= (compSize.height - radius)){
    moveY*-1;
}

Co się dzieje gdy dolna ściana jest dość szybko przesuwana do góry? Kółko odbija się, rusza w górę, ale compSize.height maleje. Zatem przy kolejnym sprawdzaniu
warunek centY >= (compSize.height - radius) jest nadal spełniony, kółko rusza w dół,... W efekcie kółko dostaje drgawek na dolnej ścianie albo poniżej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1