Autor Wątek: Arkanoid - kolizje piłki z klockami  (Przeczytany 1788 razy)

Offline Quavitor

  • Użytkownik

# Styczeń 04, 2009, 16:35:50
Skrobię sobie w XNA prostego Arkanoida ale mam duży problem z kolizjami. Siedzę nad tym dwa dni, ale nadal nie działa tak jakbym chciał. Ale do rzeczy. Jeśli chodzi o kolizje ze ścianami problemu nie ma. Cyrk zaczyna się przy kolizjach z klockami. Otóż chciałbym aby po kolizji z klockiem piłka odbiła się w drugą stronę w ten sposób:
Niestety nie mam pojęcia jak to dobrze zaprogramować. Do dyspozycji mam wektor ruchu piłki (jej pozycję i rozmiary oczywiście też) i współrzędne wierzchołków prostokąta. W obecnej miernej implementacji działa to m.w tak:
Kod: (csharp) [Zaznacz]
if(jestKolizjaPilkiZKlockiem)
{
 //tworze prostokaty dla kazdego boku klocka i oznaczam jako N, W, S, E
 if(JestKolizjaPilkiZWiencejNizJednymProstokatem)
 {
  return OdbijXY;
 }
 else if(JestKolizja z N lub S)
 {
  return OdbijY;
 }
 else
 {
  return OdbijX;
 }
}

Teraz w zależności od tego co zwróciła mi funkcja mnożę wektor ruchu piłki przez:
(-1,1) dla OdbijX
(1,-1) dla OdbijY
(-1,-1) dla OdbijXY

Kolizje działają nie tak źle jednak mało dokładnie. I tu moje pytanie: Jak zrobić żeby działało to dokładniej? Jak to powinno wyglądać?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Vipa

  • Gość
# Styczeń 04, 2009, 18:43:08
Polecam ci od razu zrezygnować z kolizji piłki jako punktu. Będziesz miał problem z przenikaniem piłeczki w miejscu:
    o
     \[==]
[==]\
       \

Najprostsza metoda to zapamiętanie w którą stronę piłeczka leciała:
-x, x, -y, y
i potem przy kolizji wykrycie, w którą ścianę klocka piłeczka uderzyła.

Możliwości dla każdego ruchu masz dwie, np:
x w poprzedniej klatce był większy, więc piłka leci w lewo.
y w poprzedniej klatce był mniejszy, więc piłka leci w dół.

I teraz masz te dwie możliwości:
piłka trafi albo w górną ścianę albo w prawą ścianę klocka. Pozostaje wykrycie która to ściana i odwrócenie prędkości piłeczki w x albo w y.

Wykrycie kolizji ze ścianą to już sprawa indywidualna. Z tymi prostokątami to w sumie mogą wystąpić błędy jeżeli te będą na siebie nachodzić. Jak nie będą nachodzić to w szczególnych przypadkach piłka ci przeleci przez środek klocka. Łatwiej jest po prostu podzielić prostokąt na 4 trójkąty i po kłopocie.

Offline Wosiu

  • Użytkownik

# Styczeń 05, 2009, 15:19:55
Zgodzę się z Vipa. Najlepszym sposobem jest wyznaczenie x i y i z ścian modelu, a potem przyrównać te które się stykają co czyni odpowiedź czyli kolizje.
« Ostatnia zmiana: Styczeń 05, 2009, 15:39:29 wysłana przez Wosiu »

Offline Quavitor

  • Użytkownik

# Styczeń 06, 2009, 21:23:43
Wielkie dzięki, z początku nie chciało działać ale jest już OK.

Vipa

  • Gość
# Styczeń 06, 2009, 21:57:50
Polecam potem napisać Panga. Od biedy to samo, ale obcykasz już totalnie piłeczki.