Autor Wątek: Pong - kąt odbicia a miejsce kolizji z paletką  (Przeczytany 1722 razy)

Offline Arthes

  • Użytkownik
    • Gromaniak

# Wrzesień 01, 2012, 14:38:48
Prawie skończyłem ponga, ale mam problem - nie wiem, w jaki sposób uzależnić kąt odbicia piłki od punktu kolizji z paletką. Możecie podsunąć jakieś rozwiązanie? Próbowałem z sinusami, cosinusami, ale niezbyt mi to wychodziło - ale to z powodu mojej marnej wiedzy. Sama mechanika gry jest dość prosta - piłeczka posiada pola x, y, speedX, speedY. Aktualnie kod odbicia wygląda tak:
if (..warunek kolizji...) {
Ball.x = LeftPaddle.x + LeftPaddle.width + Ball.radius;
Ball.speedX = -Ball.speedX;
}
I nie uwzględnia on punktu kolizji z paletką, przez co piłka odbija się ciągle tak samo.
Dzięki za pomoc.

Offline Mr. Spam

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

Offline Mike148

  • Użytkownik

  • +1
# Wrzesień 01, 2012, 15:42:16
http://aaroncox.net/tutorials/arcade/PaddleBattle.html

Co prawda w SDL'u cała gra, ale podpatrz jak on to załatwił i spróbuj sam zaimplementować.

Tu jest jeszcze w VB:
http://www.dreamincode.net/forums/topic/39686-creating-a-fully-functional-pong-game/

I ostatecznie to google i pong programming tutorial

Offline Harsay

  • Użytkownik

# Wrzesień 01, 2012, 19:58:00
Przy kolizji sprawdź pozycję Y piłeczki i zmień kąt zależnie od pozycji.

Offline JasonVoorhees

  • Użytkownik
    • FotoGry

# Wrzesień 01, 2012, 20:18:45
Najlepiej zrób paletkę przesuwającą się po dwóch osiach. W momencie odbicia dodajesz wektory z odpowiednią wagą. Albo po prostu wektor ruchu paletki nadajesz piłeczce. Ten wektor też może być przemnożony o odpowiednią wartość. http://www.jason.gd/str/pokaz/Jasonoid - coś jak w smash arkanoid ;)
« Ostatnia zmiana: Wrzesień 01, 2012, 20:21:00 wysłana przez JasonVoorhees »

Offline Oti

  • Użytkownik

  • +1
# Wrzesień 01, 2012, 20:45:37
Też piszę podobną grę(co prawda to arkanoid, nie pong, ale analogia jest). U siebie mam to rozwiązane w ten sposób:
W momencie kolizji piłki z paletką liczę "offset poprzeczny" piłeczki względem paletki, tzn. przesunięcie piłeczki wzdłuż paletki względem środka paletki. Jest to po prostu liczba z przedziału <-0.5;0.5> określająca położenie punktu kolizji na paletce. -0.5 oznacza lewą krawędź, 0.5 oznacza prawą.
Jeśli paletka w twojej grze jest równoległa do osi układu współrzędnych, to sprawa jest prosta. Zakładając, że paletka porusza się równolegle do osi Y(jeśli wzdłuż osi X, to wystarczy we wzorze zmienić "y" na "x"):
offset=(ball.pos.y-paddle.pos.y)/paddle.width;Gdzie paddle.width to oczywiście szerokość paletki. Jeśli jednak paletka nie jest równoległa do osi układu współrzędnych, to sprawa jest ciut bardziej skomplikowana-w takim wypadku po prostu napisz, wtedy postaram sie wyjaśnić.

 Mam również stałą PADDLEANGLERANGE(akurat u mnie wynosi ona PI/2.5f) określającą 'rozwarcie'-piłeczka po odbiciu się od krawędzi paletki poleci pod kątem PADDLEANGLERANGE/2.0f. Kierunek pod jakim odbije się piłeczka obliczam prostym wzorem:
 angle=PADDLEANGLERANGE*offset;
No i teraz, przy użyciu odpowiednich funkcji trygonometrycznych, możesz już sobie  obliczyć newSpeedX i newSpeedY. Teraz zależy co chcesz zrobić. Czy chcesz, by piłeczka leciała dokładnie w nowym kierunku, czy wolisz, by został uwzględniony również poprzedni kierunek piłeczki? W pierwszym wypadku po prostu przypisujesz newSpeedX/Y do speedX/Y. W drugim-możesz zrobić odpowiednią średnią ważoną z tych dwóch kierunków, względnie zwykłą średnią arytmetyczną.

Mam nadzieję, że to, co napisałem jest w miarę zrozumiałe mimo tego, że dość skomplikowanie to opisałem.
« Ostatnia zmiana: Wrzesień 01, 2012, 20:52:15 wysłana przez Oti »