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
2023.11.1.129 • 2023.11.1.160
wydana 69 dni temu
LTS
2022.0.2.51 • 2022.0.2.49
wydana 128 dni temu
Beta
2024.200.0.499 • 2024.200.0.516
wydana  wczoraj
= IDE, = Runtime
Użytkownicy online
2 użytkowników aktywnych:
gości: 1, userów: 1
 Adriann
(~ostatnie 15 minut)
Discord
44 użytkownicy online na discordzie:
LadyLush❄, 🧁Cupcake🧁, DungeonFairy🧚, MKP, s..., Alice, Nitro Slav, Carl-bot, Voytec, Wielki Druid, Add92, Kowu, Kuzyn, YoungKrystian, Radek Ignatów, PhysX ᴺⱽᴵᴰᴵᴬ, r..., lethian, HappyOrange, Moldis, Arrekin, MagnusArias, LeD, yazaa, Domeen0, Dyno, Deusald, Korodzik, 𝕳𝖚𝖌𝖔 𝕲𝖔𝖓𝖝𝖆𝖑𝖊𝖝, blackamul, Marco, m..., bagno, Tidżi, Mtax, g..., Alkapivo, moeglich, Nikas, Krzysiek1250, Shockah, Kandif, Cosplyfanka, xVANiLL
Shoutbox
gnysek (10:49, 20.02.24)
Ja czekam na pluginy do IDE, czego YYG nie zrobi, zrobimy sami.
Adriann (11:50, 16.02.24)
Ciekawe jak go przerobią, osobiście liczę na jakąś większą rewolucję a nie tylko usprawnienie bo narazie jest jak jest :d
gnysek (10:32, 08.02.24)
Edytor roomów ma swoje minusy. Ale ma być tworzony nowy wkrótce, chociaż pewnie 6-12 miesięcy zanim trafi do wersji stabilnej jak nic.
p
pablo1517 (08:40, 07.02.24)
No ja odkąd zacząłem w ue4 pracować to niestety z GMLem dawno nie obcowalem
exp (20:13, 30.01.24)
@pablo1517 ja przerzuciłem się z klasycznego GM na Studio cztery lata temu, więc przeskok trochę mniejszy, ale generalnie idea dużo się nie zmieniła. jest trochę upierdliwości i niepotrzebnych według mnie zmian, ale też duże usprawnienia (edytor roomów to raj na ziemi w porównaniu z tym oryginalnym)
Adriann (18:59, 28.01.24)
Takk..strasznie są upierdliwe :D
I am Lord (17:08, 28.01.24)
Mniej czasu się straci tworząc system particli z kodu od zera niż się męczyć z importem ich z edytora, 🤦‍♂️🤦‍♂️
I am Lord (16:56, 28.01.24)
Co jest nie tak z tymi particlami z IDE, masakra jakaś. Ile to trzeba kombinować żeby użyć je prosto z kodu
p
pablo1517 (17:57, 27.01.24)
Czyli GML nie dostał jakiś drastycznych zmian?
gnysek (14:47, 26.01.24)
Czy ja wiem... generalnie zamysł ten sam, tylko IDE nieco inne.
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?