Speed, direction, hsped, vspeed, gravity, friction - i inne sposoby poruszania
Wtorek, 25 Października 2022, 10:42
Czas czytania 5 minut, 48 sekund
Zgodne z GM:
Artykuł omawia podstawowe zmienne dotyczące prędkości i poruszania w GameMakerze. Wyjaśnia też czym są tzw. lengthdiry.
W GameMakerze istnieje wiele sposobów na przemieszczanie instancji - wszystkie jednak sprowadzają się do zmian pozycji
Ten artykuł omówi je, oraz ich zależności.
speed + direction kontra hspeed + vspeed
GameMaker posiada kilka wbudowanych zmiennych w każdej instancji (bez względu czy ich używamy czy nie), które do tego są od siebie zależne - tzn. zmiana jednej z nich automatycznie zmienia drugą.
Najbardziej zrozumiałe będą dla każdego zmienne które może znać z lekcji fizyki - czyli kierunek (zwrot) i prędkość.
Wskazówka:
Kierunek 0 stopni w GM oznacza w prawo, a kolejne stopnie poruszają się przeciwnie do wskazówek zegara - 90 to "w górę" itd. 360 i 0 są oczywiście tożsame
Za prędkość odpowiada
Używana jest do tego funkcja (z której skorzystać możemy także samodzielnie), tzw. lengthdir - zwraca ona, ile przy danej prędkości i zadanym kierunku zmienią się pozycje. Najprościej wyobrazić sobie to tak, że od obecnego miejsca x,y w którym jest nasza instancja, rysujemy linię o długości
Wskazówka:
W grafice komputerowe, przeciwnie do tego czego uczymy się w szkole, oś y rośnie "w dół"
Załóżmy, że nasz obiekt jest na pozycji 1,1, ma prędkość 4 i kierunek 330 stopni. Gdzie wyląduje w następnej klatce obrazu?
To właśnie wyliczą funkcje lengthdir (długość i kierunek).
kod// pozycja x zwiększy się o:
lengthdir_x(speed, direction)
// podstawmy:
lengthdir_x(4, 300)
// w wyniku otrzymamy 3.46Pozycja obiektu na osi X zwiększy się więc o 3.46, a ponieważ teraz wynosiła jeden, zwiększy się do 4.46. W następnej klatce będzie to 7,92.
Podobnie ma się sprawa z osią y - tutaj akurat lengthdir wynosi całkowitą ilość - lengthdir_y(4, 300) to 2, zatem obiekt wyląduje na y = 3.
Wskazówka:
Korzystając z funkcji lengthdir, można stworzyć ruch po okręgu lub elipsie - wystarczy do punktu, w którym chcemy, aby był środek tej figury, dodawać lengthdir_x/y o wartości len będącej promieniem okręgu/elipsy, oraz wartości dir, odpowiadającej temu, pod jakim kątem od środka chcemy widzieć teraz instancję. Zwiększając dir co step, uzyskamy pozorny ruch po obwodzie. Aby nie przekraczać 360 stopni (GameMaker potrafi sobie co prawda radzić z takimi wartościami), można użyć kodu
Jak widać, minusem korzystania z dowolnego kierunku i prędkości jest możliwość uzyskania wartości ułamkowych pozycji.
Wspomniałem już wcześniej, że zmiana speed i direction wpływa na hspeed i vspeed i vice-versa. GameMaker jest tak zbudowany, że zmiana którejkolwiek z tych czterech zmiennych, wpływa na pozostałe 3.
Wskazówka:
Pozycje są zmieniane na podstawie speed/direction i hspeed/vspeed po evencie Step, ale przed eventem End Step. Więcej informacji w dokumentacji: manual.yoyogames.com/.../Event_Order.htm
hspeed i vspeed to nic innego, jak właśnie wynik działania funkcji lengthdir_x (dla hspeed, horizontal speed - prędkość horyzontalna/pozioma) i lengthdir_y (dla vspeed, vertical speed - prędkość wertykalna/pionowa). Jeśli więc ustawiamy speed na 4 i direction na 330, to hspeed będzie równe 3.46, a vspeed 2.
Działa to też na odwrót - jeśli ustawimy hspeed na 3.46, a vspeed na 2, to speed przybierze wartość
Wskazówka:
Znając te zależności, znacznie łatwiej jest używać własnych zmiennych do przesuwania instancji
Warto tutaj zauważyć, że hspeed i vspeed użyjemy najczęściej gdy poruszamy się w czterech kierunkach, lub po skosie, oraz zależy nam, aby nowa pozycja była liczbą całkowitą. Nie ważne której wersji używamy, jeśli potrzebujemy dowiedzieć się o ile na danej osi przesuwa się nasza instancja, jaką ma prędkość, lub jaki kierunek - wystarczy odczytać przeciwne wartości (lub skorzystać z funkcji, które wyznaczają daną rzecz - jak na obrazki powyżej).
gravity, gravity_direction
Są też pewne dodatkowe zmienne, które mogą dodatkowo zaburzać nasze zmienne speed/direction (a tym samym hspeed/vspeed).
Te wartości, za pomocą funkcji lengthdir, będą dodane po każdym evencie step do speed/direction (a tym samym hspeed/vspeed).
Można powiedzieć, że hspeed (a tym samym x), zwiększy się w kazdym kroku o
kodlengthdir_x(gravity,gravity_direction)a vspeed odpowiednio o
kodlengthdir_y(gravity,gravity_direction)
friction
Ostatnią mocą, która może wpłynąć na nasze zmienne kierunkowe, jest ustawienie
Łatwo też wyliczyć w ciągu ilu klatek zatrzyma się obiekt. Np. dla speed=5, a friction=1, obiekt stanie po 4 klatkach obrazu (czwarta klatka będzie ostatnią w której będziemy widzieć jego ruch; przy pierwszym evencie draw, mimo ustawienia prędkości na 5, prędkość wynosi już 4 i o 4 piksele przesunął się obiekt, bowiem friction i gravity zostają uwzględnione przed zmianą x i y).
x, y
. W przypadku gier, w których poruszamy się w dwóch lub czterech kierunkach, zazwyczaj wystarczy sprawdzanie czy dany klawisz jest wciśnięty - i zwiększanie jednej z tych pozycji. W grach z widokiem z góry (ale nie tylko) możemy potrzebować już bardziej zaawansowanego systemu - i chociaż używanie do tego własnych zmiennych może działać lepiej (jeśli chcemy pauzować grę - to po prostu przez chwilę nie przetwarzamy naszych zmiennych), można też skorzystać z wbudowanych w GameMakera zmiennych.Ten artykuł omówi je, oraz ich zależności.
speed + direction kontra hspeed + vspeed
GameMaker posiada kilka wbudowanych zmiennych w każdej instancji (bez względu czy ich używamy czy nie), które do tego są od siebie zależne - tzn. zmiana jednej z nich automatycznie zmienia drugą.
Najbardziej zrozumiałe będą dla każdego zmienne które może znać z lekcji fizyki - czyli kierunek (zwrot) i prędkość.
Wskazówka:
Kierunek 0 stopni w GM oznacza w prawo, a kolejne stopnie poruszają się przeciwnie do wskazówek zegara - 90 to "w górę" itd. 360 i 0 są oczywiście tożsame
Za prędkość odpowiada
speed
a za kierunek direction
. Ustawiając daną prędkość w danym kierunku, wiemy, że o tyle pikseli na ekranie przesunie się nasza instancja. Jak jednak wyliczane są x i y?Używana jest do tego funkcja (z której skorzystać możemy także samodzielnie), tzw. lengthdir - zwraca ona, ile przy danej prędkości i zadanym kierunku zmienią się pozycje. Najprościej wyobrazić sobie to tak, że od obecnego miejsca x,y w którym jest nasza instancja, rysujemy linię o długości
speed
w kierunku direction
. Następnie koniec tej linii rzutujemy na osie x i y - i to będą nowe pozycje instancji.Wskazówka:
W grafice komputerowe, przeciwnie do tego czego uczymy się w szkole, oś y rośnie "w dół"
Załóżmy, że nasz obiekt jest na pozycji 1,1, ma prędkość 4 i kierunek 330 stopni. Gdzie wyląduje w następnej klatce obrazu?
To właśnie wyliczą funkcje lengthdir (długość i kierunek).
kod// pozycja x zwiększy się o:
lengthdir_x(speed, direction)
// podstawmy:
lengthdir_x(4, 300)
// w wyniku otrzymamy 3.46Pozycja obiektu na osi X zwiększy się więc o 3.46, a ponieważ teraz wynosiła jeden, zwiększy się do 4.46. W następnej klatce będzie to 7,92.
Podobnie ma się sprawa z osią y - tutaj akurat lengthdir wynosi całkowitą ilość - lengthdir_y(4, 300) to 2, zatem obiekt wyląduje na y = 3.
Wskazówka:
Korzystając z funkcji lengthdir, można stworzyć ruch po okręgu lub elipsie - wystarczy do punktu, w którym chcemy, aby był środek tej figury, dodawać lengthdir_x/y o wartości len będącej promieniem okręgu/elipsy, oraz wartości dir, odpowiadającej temu, pod jakim kątem od środka chcemy widzieć teraz instancję. Zwiększając dir co step, uzyskamy pozorny ruch po obwodzie. Aby nie przekraczać 360 stopni (GameMaker potrafi sobie co prawda radzić z takimi wartościami), można użyć kodu
dir = dir mod 360
co automatycznie odejmie 360 od wartości wyższych niż 360Jak widać, minusem korzystania z dowolnego kierunku i prędkości jest możliwość uzyskania wartości ułamkowych pozycji.
Wspomniałem już wcześniej, że zmiana speed i direction wpływa na hspeed i vspeed i vice-versa. GameMaker jest tak zbudowany, że zmiana którejkolwiek z tych czterech zmiennych, wpływa na pozostałe 3.
Wskazówka:
Pozycje są zmieniane na podstawie speed/direction i hspeed/vspeed po evencie Step, ale przed eventem End Step. Więcej informacji w dokumentacji: manual.yoyogames.com/.../Event_Order.htm
hspeed i vspeed to nic innego, jak właśnie wynik działania funkcji lengthdir_x (dla hspeed, horizontal speed - prędkość horyzontalna/pozioma) i lengthdir_y (dla vspeed, vertical speed - prędkość wertykalna/pionowa). Jeśli więc ustawiamy speed na 4 i direction na 330, to hspeed będzie równe 3.46, a vspeed 2.
Działa to też na odwrót - jeśli ustawimy hspeed na 3.46, a vspeed na 2, to speed przybierze wartość
point_distance(0,0,hspeed,vspeed)
(długość przeciwprostokątnej trójkąta o szerokości hspeed i wysokości vspeed), a zmienna direction przybiera wartość point_direction(0,0,hspeed,vspeed)
(kierunek z punktu 0,0 do punktu hspeed, vspeed).Wskazówka:
Znając te zależności, znacznie łatwiej jest używać własnych zmiennych do przesuwania instancji
Warto tutaj zauważyć, że hspeed i vspeed użyjemy najczęściej gdy poruszamy się w czterech kierunkach, lub po skosie, oraz zależy nam, aby nowa pozycja była liczbą całkowitą. Nie ważne której wersji używamy, jeśli potrzebujemy dowiedzieć się o ile na danej osi przesuwa się nasza instancja, jaką ma prędkość, lub jaki kierunek - wystarczy odczytać przeciwne wartości (lub skorzystać z funkcji, które wyznaczają daną rzecz - jak na obrazki powyżej).
gravity, gravity_direction
Są też pewne dodatkowe zmienne, które mogą dodatkowo zaburzać nasze zmienne speed/direction (a tym samym hspeed/vspeed).
gravity
oznacza moc z jaką instancja jest przyciągana, a gravity_direction
oznacza w którą stronę się to dzieje.Te wartości, za pomocą funkcji lengthdir, będą dodane po każdym evencie step do speed/direction (a tym samym hspeed/vspeed).
Można powiedzieć, że hspeed (a tym samym x), zwiększy się w kazdym kroku o
kodlengthdir_x(gravity,gravity_direction)a vspeed odpowiednio o
kodlengthdir_y(gravity,gravity_direction)
friction
Ostatnią mocą, która może wpłynąć na nasze zmienne kierunkowe, jest ustawienie
friction
, czyli tarcie (i błagam, nie mówcie "frykcja", bo ona oznacza raczej ruch w pętli). Jej działanie jest stosunkowo proste - dodatnia wartość zmniejsza w każdym kroku speed (i przelicza na vspeed/hspeed) o podaną przez nas wartość, a ujemna odwrotnie - przyspiesza obiekt.Łatwo też wyliczyć w ciągu ilu klatek zatrzyma się obiekt. Np. dla speed=5, a friction=1, obiekt stanie po 4 klatkach obrazu (czwarta klatka będzie ostatnią w której będziemy widzieć jego ruch; przy pierwszym evencie draw, mimo ustawienia prędkości na 5, prędkość wynosi już 4 i o 4 piksele przesunął się obiekt, bowiem friction i gravity zostają uwzględnione przed zmianą x i y).