• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[SDL 2] Kierunek pocisku wystrzelonego z pistoletu.

42 Warsaw Coding Academy
+1 głos
561 wizyt
pytanie zadane 9 grudnia 2015 w Algorytmy przez Adriqun Początkujący (290 p.)
Witam serdecznie, ostatnio pełen energii zacząłem robić lekcje z SDL'a 2 od "lazy foo". Po kilkudziesięciu zrobionych programach zacząłem robić grę, natrafiłem na problem który polegał na tym, że pocisk wystrzelony z pistoletu lecąc w strone kursora skręcał (planuje uzyskać ruch prostoliniowy). Dla zobrazowania problemu dorzucam (grafika) http://wstaw.org/w/3HWg/ . Chodzi o to żeby uzyskać funkcje liniową jednak z tego co widzę współrzędne tekstury (SDL_Rect) można zmieniać za pomocą liczb całkowitych. W skrócie jak uzyskać linie prostą? Czy ktoś kiedyś miał podobny problem tworząc gre? Fragment kodu: http://4programmers.net/Pastebin/4575 Efekt który chce uzyskać (grafika) - http://wstaw.org/w/3HWk/ . Za cokolwiek z Twojej strony dziękuje.

4 odpowiedzi

+1 głos
odpowiedź 9 grudnia 2015 przez draghan VIP (106,230 p.)
wybrane 9 grudnia 2015 przez Adriqun
 
Najlepsza

Mamy sytuację jak na rysunku.

Współrzędne pocisku zmieniają się od czasu. Jeśli jest to ruch nieprzyspieszony, jego równania ruchu są następujące:

x(t) = X0 + Vx*t
y(t) = Y0 + Vy*t

gdzie Vx i Vy to składowe wektora prędkości a X0 i Y0 to punkt położenia początkowego pocisku, nazwijmy go Pp. Jak obliczyć składowe pokażę za moment. Zajmijmy się na razie samym wektorem prędkości.

Wektor ten charakteryzuje się długością r (czyli wartością prędkości - szybkością) oraz kątem z nachylenia, powiedzmy od poziomu.
Długość nadajesz mu Ty, jako programista. Natomiast kąt będzie wyznaczany na podstawie współczynnika kierunkowego prostej, łączącej współrzędne pocisku Pp ze współrzędnymi kursora Pk. :)

Mając Pp = (Xp, Yp) oraz Pk = (Xk, Yk), współczynnik kierunkowy prostej łączącej te dwa punkty wyznaczasz ze wzoru (wyprowadzone z układu dwóch równań):
a = (Yp - Yk) / (Xp - Xk)
Współczynnik ten jest równy tg(z), a więc kąt jest równy:

z = arctg(a) = arctg((Yp - Yk) / (Xp - Xk))

Tym sposobem dostajesz kąt, masz więc w pełni określony wektor prędkości. Możesz rozbić go na składowe wzdłuż osi współrzędnych. Ich kąty są znane, bo wynoszą 0 i 90 stopni, więc należy określić tylko ich długość. Z definicji funkcji sinus i cosinus:

Vx = r*cos(z)

Vy = r*sin(z)

Teraz tylko podstawić do równań ruchu. :)

x(t) = Xp + r*cos(z)*t

y(t) = Yp + r*sin(x)*t

W momencie kiedy user kliknie myszą, pobierasz współrzędne kursora, obliczasz kąt i zapisujesz go jako jedna z danych pocisku, wraz z punktem początkowym. Potem tylko co klatkę (czy kiedy to tam uaktualniasz) wyliczasz nową pozycję według powyższych równań ruchu. :) Pamiętaj że r, czyli wartość szybkości, nadajesz Ty. ;)

EDIT: trochę mi zeszło pisanie tego, jak widzę już są 4 odpowiedzi... Gdybym wiedział, to bym tyle się nie rozpisywał. :P

+3 głosów
odpowiedź 9 grudnia 2015 przez Grzyboo Nałogowiec (28,880 p.)
Czyli, że chcesz aby pocisk leciał w stronę punktu, gdzie kliknąłeś myszką? To może zamiast na bieżąco ustawiać tor lotu pocisku względem kursora to ustal podczas kliknięcia za pomocą funkcji trygonometrycznych jaki powinien być stosunek prędkości X do Y, a potem z tą stałą prędkością przesuwaj obiekt.
komentarz 9 grudnia 2015 przez jegor377 Stary wyjadacz (13,230 p.)
służy do tego funkcja atan2(y, x); ona przyjmuje różnice pozycji i zwraca bodajże kąt między nimi podany w radianach. :) potem jak mówisz 2 funkcje i finish. :D
+1 głos
odpowiedź 9 grudnia 2015 przez Patrycjerz Mędrzec (192,320 p.)
+1 głos
odpowiedź 9 grudnia 2015 przez niezalogowany
To ja odsyłam tak gdzie Patrycjerz + inny (bardzo fajny) sposób z bloga Szymona Siarkiewicza http://szymonsiarkiewicz.pl/poradniki/goto/podazanie-za-obiektem-w-przestrzeni-2d/

Podobne pytania

0 głosów
2 odpowiedzi 1,108 wizyt
pytanie zadane 6 lutego 2016 w C i C++ przez Slavian Początkujący (420 p.)
0 głosów
1 odpowiedź 265 wizyt
pytanie zadane 26 lutego 2016 w C i C++ przez jegor377 Stary wyjadacz (13,230 p.)
+2 głosów
1 odpowiedź 594 wizyt
pytanie zadane 3 grudnia 2015 w C i C++ przez yogobella Początkujący (290 p.)

93,382 zapytań

142,382 odpowiedzi

322,540 komentarzy

62,738 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...