Skocz do zawartości

Oczy podążające za kursorem


Rekomendowane odpowiedzi

Witam.

 

Chce zrobić oczy, które będą podążać za kursorem (myszką: mouse_x, mouse_y). Jak narazie wystarczy mi podpowiedź, jakie funkcje miałbym do tego użyć. Próbowałem z "move_towards" aby oczy podążały za myszką, oraz "place_meeting", aby oczy podążały za kursorem tylko wtedy kiedy dotykają głowy.

Odnośnik do komentarza
Udostępnij na innych stronach

Oczy powinny pozostać w pewnej odległości od kursora, ale powinny kierować się w jego kierunku.

Funkcja point_direction(x1,y1,x2,y2) da ci kierunek od głowy do kursora

Funkcja lengthdir_x(length,direction) zwróci odpowiednią współrzędną wektora o długości length, zaczepionego w punkcie (0,0) i skierowanego w kierunku direction. To samo dla lengthdir_y.

Twoim zadaniem jest narysować oczy w pewnej odległości od środka głowy i skierowane w stronę kursora.

Odnośnik do komentarza
Udostępnij na innych stronach

Magia, działa :) Szkoda tylko, że efekt uzyskałem poprzez losowe wstawianie liczb i funkcji, więc był to czysty przypadek, że mi się udało. Musze troche poczytać o tych lengthdirach. Tak z ciekawości, często się ich używa ? na przykład do czego ?

 

Kod:

GML
draw_sprite(sEye,1,x+lengthdir_x(5,point_direction(self.x,self.y,mouse_x,mouse_y)),y+lengthdir_y(5,point_direction(self.x,self.y,mouse_x,mouse_y)))

Efekt:

9b703dba58063.gif

Zastrzeżenia ?

 

PS: Zapomniałbym podziękować ^^, a więc, dziękuje :P

Odnośnik do komentarza
Udostępnij na innych stronach

lengthdir_x(len,dir) := len*dcos(dir)

lengthdir_y(len,dir) := -len*dsin(dir)

W dużych grach takie coś jest bezużyteczne, bo funkcje sin i cos są bardzo wymagające pod kątem mocy obliczeniowej(*), zamiast tego używa się wektorów do obliczania takich rzeczy. Na tym trzeba się niestety trochę znać.

Lengthdiry są w porządku, jeżeli nie zależy ci na wydajności, a chcesz uzyskać efekt szybko.

 

(*)Mam na myśli, że jeżeli co klatkę używasz funkcji sin(x) tysiące razy, to rzeczywiście jest to dużo mniej wydajne od stosowania wektorów, natomiast jesli używasz tych funkcji, powiedzmy, 20-30 razy na klatkę, to nic złego się nie dzieje. Po prostu żeby było wiadomo, że dla małych projektów lengthdiry są spoko, a dla dużych są be.

 

Lengthdiry są wykorzystywane do parametryzacji pewnych krzywych, np. okręgu (czyli tego, co zrobiłeś), a to ma trochę zastosowań, np:

-obliczenie wektora prędkości dla pocisku, który ma być skierowany w kierunku pewnego punktu;

-umieszczanie obiektów w stałej odległości od pewnego głównego obiektu, ale w zmiennym kierunku (mniej więcej to, co u ciebie)

Odnośnik do komentarza
Udostępnij na innych stronach

Z takich praktycznych zastosowań, to na pewno to, że jak strzelasz to pocisk tworzy się nie od postaci, a od końca lufy.

Jeśli będziesz korzystał z różnych draw_line() itd. Osobiście korzystam z nich bardzo często.

Albo jak masz dwa oddzielnie obiekty które mają być do siebie "sklejone", to lengthdiry się mogą przydać. Zapamiętaj tylko, że

lengthdir_x(dlugosc_linii, obrot_linii);

(tak teraz patrzę, napisałem prawie to samo co Amaterasu, ale mniej fachowym językiem)

Odnośnik do komentarza
Udostępnij na innych stronach

dla małych projektów lengthdiry są spoko, a dla dużych są be.

Chyba najbardziej zapadło mi w pamięć :D .

 

Albo jak masz dwa oddzielnie obiekty które mają być do siebie "sklejone", to lengthdiry się mogą przydać.

Gdzieś to widziałem w przykładach i chyba zaczne tego używać, bo jak narazie, nie mam jakiś gigantycznych projektów.

 

Dzięki za wyjaśnienia i pomoc, zawsze chciałem coś takiego zrobić i wkońcu mi się udało :P

Odnośnik do komentarza
Udostępnij na innych stronach

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ę
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...