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: gm5 gm6 gm7 gm8 gms1 gms2
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 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

Grafika: /upload/ajax/20221025_274e402c5af9f8de2ee066f9033c7386.png

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.46
Pozycja 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.

Grafika: /upload/ajax/20221025_b629f25b6a159625db4aa491ce419eb4.png

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ż 360

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ść 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).

Grafika: /upload/ajax/20221025_535fed94f645889d86ef8374bdd4ff44.png

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

Komentarze (łącznie 0):
Nie ma jeszcze żadnego komentarza. Czas to zmienić

Najnowsze wersje GameMakera:

Stabilna
2024.8.1.171 • 2024.8.1.218
wydana 72 dni temu
LTS
2022.0.2.51 • 2022.0.2.49
wydana 401 dni temu
Beta
2024.1100.0.686 •
2024.1100.0.707
 0.13.0

wydana  6 dni temu
= IDE, = Runtime, = GMRT
Użytkownicy online
1 użytkownik aktywny:
gości: 1,
(~ostatnie 15 minut)
Discord
30 użytkowników online na discordzie:
Kysiu, Alice, Nitro Slav, Carl-bot, Saus, TobiasM (Morgo), GMRussell, Gameduro, fervi, Radek Ignatów, antek, Michał Parkoła, chleb, Moldis, Pako, Arrekin, MagnusArias, LadyLush, Dyno, Korodzik, LeD, Ulti, bagno, Tidżi, g..., Sporek, l..., Shockah, Kandif, PeekoHiko
Shoutbox
gnysek (11:46, 17.11.24)
Witamy, witamy!
baca (12:22, 16.11.24)
To już 25 lat.. Witam po paru latach nieobecności.
gnysek (11:05, 15.11.24)
Natomiast obecne forum istnieje od 2004, jak z iglu.cz na gmclan.org przeszliśmy i od tego czasu nie było resetów danych.
gnysek (12:35, 13.11.24)
Ogólnie GMCLAN istnieje 22 lata, ale na to trofeum nie zrobiłem (jeszcze xD)
Chell (20:41, 08.11.24)
wow, ta emotka w ogóle nie wygląda jak : O xD
Chell (20:40, 08.11.24)
tylko? :O 4tk ma 15
Borek (18:12, 07.11.24)
Właśnie dostałem powiadomienie z forum, że jestem na GMClanie 18 lat :D Ja pierdzielę...
S
Sutikku (08:43, 18.10.24)
TIL, gamemaker jest starszy ode mnie
gnysek (16:04, 15.10.24)
Za równo miesiąc, GameMaker kończy 25 lat.
Wojo (15:38, 05.09.24)
Ciekawe
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?