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.2.0.132 • 2024.2.0.163
wydana 25 dni temu
LTS
2022.0.2.51 • 2022.0.2.49
wydana 164 dni temu
Beta
2024.400.0.526 • 2024.400.0.547
wydana  2 dni temu
= IDE, = Runtime
Użytkownicy online
1 użytkownik aktywny:
gości: 1,
(~ostatnie 15 minut)
Discord
44 użytkownicy online na discordzie:
s..., Alice, Nitro Slav, Carl-bot, p..., Voytec, Grela, Wielki Druid, Add92, Kuzyn, OdrzuconyKrakers, fervi, m..., YoungKrystian, Sevitaus, Radek Ignatów, Kalor, r..., antek, 🧁Cupcake🧁, Uzjel, lethian, MKP (GEM), Arrekin, MagnusArias, Dyno, 🆅🅸🆃🅾74🅼, Deusald, ZYGZAK, 𝕳𝖚𝖌𝖔 𝕲𝖔𝖓𝖝𝖆𝖑𝖊𝖝, Miłosz, Marco, LeD, Ulti, m..., LadyLush, bagno, Mtax, DungeonFairy🧚, Alkapivo, Nikas, Shockah, Kandif, xVANiLL
Shoutbox
I am Lord (19:15, 17.03.24)
6h mam na to hmmm
I am Lord (19:06, 17.03.24)
Ale temat fajny
gnysek (01:33, 13.03.24)
Powinno działać, jest w kodzie sortowanie wg. najbliższego startu :)
Uzjel (21:59, 11.03.24)
Nie, ale za pierwszym razem zrobiłem fuckup, że było "Tura testowa" X_X
I am Lord (16:58, 11.03.24)
A co Uzjel już masz nawymyślane 100 tematów? 😅
Uzjel (20:08, 10.03.24)
@gnysek a jak bym dodał kilka lig na raz to walnie?
Uzjel (20:08, 10.03.24)
Liga będzie zawsze od piątku 16:00 do poniedziałku 23:59, zawsze w środku miesiąca.
gnysek (08:48, 10.03.24)
Tak, to też jest do poprawy X_X
Adriann (18:22, 09.03.24)
Tylko myślę czy nie leiej gdyby mówiło że zostało tyle i tyle dni i ileś godzin a nie tylko w godzinach ;d Albo konkretna data obok, byłoby czytelniej
I am Lord (15:08, 08.03.24)
o super z tą ligą :)
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?