• 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.

Object Storage Arubacloud
+1 głos
449 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,860 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 671 wizyt
pytanie zadane 6 lutego 2016 w C i C++ przez Slavian Początkujący (420 p.)
0 głosów
1 odpowiedź 209 wizyt
pytanie zadane 26 lutego 2016 w C i C++ przez jegor377 Stary wyjadacz (13,230 p.)
+2 głosów
1 odpowiedź 522 wizyt
pytanie zadane 3 grudnia 2015 w C i C++ przez yogobella Początkujący (290 p.)

92,580 zapytań

141,432 odpowiedzi

319,665 komentarzy

61,965 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...