LolikZabójca Opublikowano 17 Grudnia 2021 Opublikowano 17 Grudnia 2021 Potrzebuję napisać wydawało by się prostą funkcję, ale nie mogę z jakiegoś powodu napisać jej dobrze. W dodatku nie mam pojęcia pod jakim hasłem to Google'ować. Potrzebuję wykonać funkcję która na podstawie danych: a) obrót aktualny w stopniach b) obrót docelowy w stopniach c) siła obrotu w stopniach Obliczy jak obrócić się w stronę danego obiektu o daną ilość stopni. Ma to spowodować efekt nienadążania za szybko ruszającymi się celami. Taką funkcję myślę, że stosuję się też np przy pisaniu obrotu "ociężałej" lufy czołgu. Ja chcę go użyć do czego innego, ale funkcja będzie ta sama(tak mi się przynajmniej wydaję. Chodzi o to, że jeśli siła obrotu wynosi 5, to skrypt ma właściwie obliczyć kąt docelowy. Czyli kąt A(kąt aktualny) dodać siłę np. 5 stopni(niebieski kolor strzałka i napis) daje kąt b(obrót docelowy). Czyli jakby obrócił o 5 stopni, ale czy w stronę wskazówek zegara, czy w przeciwną to właściwe to co ma obliczyć mi ten skrypt. Będę mega wdzięczny za pomoc. PS.: wiem, że rysunki są przecudne ❤️
SimianVirus7 Opublikowano 17 Grudnia 2021 Opublikowano 17 Grudnia 2021 Patrzyłeś lerp()? Czyli coś w stylu aktualne = lerp(aktualne, docelowe, 0.5) //0.5 - siła z jaką ma obracać
LolikZabójca Opublikowano 17 Grudnia 2021 Autor Opublikowano 17 Grudnia 2021 34 minuty temu, SimianVirus7 napisał: Patrzyłeś lerp()? Czyli coś w stylu aktualne = lerp(aktualne, docelowe, 0.5) //0.5 - siła z jaką ma obracać Mogę wysłać Ci na priv projekt(dosłownie kilkanaście linijek kodu)? Nie rozumiem jak korzystać z tego w praktyce
Filar Społeczności Korodzik Opublikowano 18 Grudnia 2021 Filar Społeczności Opublikowano 18 Grudnia 2021 Nie jestem pewien, czy dobrze rozumiem... Zakładam, że chodzi o coś takiego: sprawdź, jaki obrót (w lewo czy w prawo) najszybciej dotrze do kąta docelowego, i obróć się w tym kierunku? Odpowiedni kod wyglądałaby mniej więcej następująco (w GML'u nic nie robiłem od dawna, więc nie gwarantuję, że zadziała:) current_angle = kąt obecny target_angle = kąt docelowy turn_speed = siła obrotu if (current_angle != target_angle) { turn_dir = sign(sin(pi*(target_angle-current_angle)/180)); if (turn_dir == 0) turn_dir == 1; // Avoid the rotation stopping if current and target angle are at exactly opposite sides current_angle += turn_dir * turn_speed; } Aha, kąty na twoim obrazku są chyba niepoprawne (w GM:S 0 stopni = prawo, 90 stopni = góra) - taki szczegół. EDIT: Kod nieco dłuższy, ale pewnie bardziej wydajny (bo unikamy obliczania sin): if (current_angle != target_angle) { angle_diff = target_angle - current_angle; if (angle_diff > 180) angle_diff = angle_diff - 360; if (angle_diff < -180) angle_diff = angle_diff + 360; turn_dir = sign(angle_diff); if (turn_dir == 0) turn_dir == 1; // Avoid the rotation stopping if current and target angle are at exactly opposite sides current_angle += turn_dir * turn_speed; }
Administratorzy gnysek Opublikowano 18 Grudnia 2021 Administratorzy Opublikowano 18 Grudnia 2021 Przypominam o funkcji angle_difference LolikZabójca 1
Filar Społeczności Korodzik Opublikowano 18 Grudnia 2021 Filar Społeczności Opublikowano 18 Grudnia 2021 Tak jakoś miałem przeczucie, że na pewno w GM:S jest jakaś super wymyślna funkcja, która czyni moją odpowiedź niepotrzebną
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się