Przyszła pozycja gracza

Przykład pokazuje jak obliczyć przyszłą pozycję gracza na podstawie jego kierunku i prędkości. Przydatne jest to w grach typu Tower Defence, strategiach, TDS'ach.

Autor: Uzjel

Rozmiar
13 KB
Autor
Uzjel
Ocena
7/10
12 głosy
Komentarze
Komentarze (łącznie 11):
Robert Prus (Pią., 24 Wrz. 10, 17:06)
#1

Świetne! Wreszcie moi łucznicy będą trafiać w ruchomy cel :D

Dawidds (Pią., 24 Wrz. 10, 18:21)
#2

Idea przykładu fajna, ale jednak zastosowany mechanizm sprawia że przy stałym ruchu gracza kościotrup nie zawsze trafia (chociaż i tak w większości trafia, a w tdsach nie ma co się z tym bawić bo i tak gracz będzie robił uniki) w cel. Nie mam pomysłu jak to wyjaśnić to daję obrazek:
img832.imageshack.us/.../fgfdgdfg.png

I teraz po kolei kroki, które wykona algorytm w tym przykładzie (czarne to kościotrup, niebieskie jabłko):
1. Sprawdzamy, w ilu klatkach strzała doleci do AKTUALNEJ pozycji gracza. Wynik - 4 klatki (taki przykład ofc). Czerwona linia na obrazku.
2. Obliczamy, na jakiej pozycji będzie gracz za tyle klatek, ile wyszło na wyżej. Niebieska linia na obrazku, ta pozycja gracza, która nam wyszła jest oznaczona jako puste niebieskie kółko.
3. Strzelamy w to puste niebieskie kółko. Zielona linia na obrazku.
//tutaj koniec algorytmu, ale obserwujmy dalszy przebieg zdarzeń
4. Niestety, wyszło tak, że strzale dojście do pozycji którą wyliczyliśmy zajęło 6 klatek (sprawdzaliśmy to w 1 punkcie, wtedy innymi danymi nie dysponowaliśmy), a nie 4. I przez te 6 klatek gracz zdążył ominąć trajektorię - różowe kółko.

Obliczanie pozycji, na której będzie gracz w momencie gdy trafi go strzała nie opiera się na dystansie do rzeczywiście tego punktu, gdzie trafi go strzała (choć szczerze sam nie mam pojęcia jakby to obliczyć, mógłby się wypowiedzieć jakiś ekspert : D), a na dystansie do gracza. A nas interesuje PRZYSZŁA pozycja gracza i to na niej powinniśmy oprzeć obliczenia - a nie na aktualnej.
Opieramy się na czerwonej kresce, a powinniśmy na zielonej.

Inna sprawa, że wychodzi na to, że aby obliczyć przyszłą pozycję gracza potrzebujemy pozycji gracza. Dlatego to takie ciekawe : D

Tymon (Pią., 24 Wrz. 10, 18:25)
#3

Ale Ty uwzględniasz ruch przyspieszony którego nie ma w tym przykładzie.

Dawidds (Pią., 24 Wrz. 10, 18:25)
#4

Nie chce mi się myśleć dokładnie jaki by to miało sens, ale logiczne wydawało by się zrobienie po prostu powiedzmy 5 iteracji - z których każda opierała by się na wyniku poprzedniej.
Czyli że rysunek który wyżej dałem to 1 iteracja - w drugiej program liczy, gdzie będzie gracz za 6 klatek (długość zielonej kreski, tą, którą właśnie obliczyliśmy). I wtedy przekazujemy do następnej iteracji, aby obliczyła, gdzie będzie gracz za (tutaj wynik tej 2 iteracji) klatek.

Całkowicie precyzyjne by to nie było, ale było by to już dużo większe przybliżenie.

Tymon (Pią., 24 Wrz. 10, 18:27)
#5

Stary, komplikujesz sobie życie. Do podręcznika fizyki, marsz.

Dawidds (Pią., 24 Wrz. 10, 18:37)
#6

Nie, nie uwzględniam przyspieszonego : D

Obliczamy, gdzie będzie gracz, gdy trafi go strzała - ale opieramy to na AKTUALNEJ sytuacji (aktualnym dystansie kościotrup-gracz, co przekłada się na wynik "w ilu klatkach strzała dotrze do celu"), a nie na tej przyszłej. Nie mam pojęcia jak to lepiej wyjaśnić, także muszę liczyć, że kogoś oświeci i zrozumie, o co mi chodzi ;)

Tyle tylko że mówię, do gier to w 100% wystarcza - ale tak czysto teoretycznie patrząc to ten przykład nie jest całkiem skuteczny :P

Zresztą najlepiej zwiększyć sobie ekran i się zauważy, że rzeczywiście gdy poruszamy się tak, że szybko zmienia się dystans jabłko-kościotrup (mijamy go w odległości gdzieś 150px) to szkielet w nas po prostu nie trafia (mimo, że nie zmieniamy kierunku ani prędkości).

Dawidds (Pią., 24 Wrz. 10, 18:38)
#7

Chyba inne podręczniki od fizyki mamy :(

Tymon (Pią., 24 Wrz. 10, 18:46)
#8

Dobra, już to widzę.

W alarmie szkielecika trzeba poprawić liczenie dist.

dist = point_distance(
x,
y,
obj_apple.x + lengthdir_x( obj_apple.apple_speed, obj_apple.apple_direction ),
obj_apple.y + lengthdir_y( obj_apple.apple_speed, obj_apple.apple_direction )
);

Zwykły błąd, bo w końcu ma strzelać w kierunku przyszłej pozycji jabłka, a nie obecnej.

Dawidds i tak masz pałę za sposób rozwiązania problemu. :P

Uzjel (Pią., 24 Wrz. 10, 20:01)
#9

Napiszmy o tym pracę magisterską i chodźmy na piwo. Dla mnie tamto rozwiązanie jest wystarczające, bo snajper nie jest potrzebny :)

p
pablo1517 (Pon., 29 Lis. 10, 16:45)
#10

Dawidds, to nie wystarczy brać sobie odległości kosciotrup - przyszła pozycja gracza, zamiast kosciotrup - gracz? Wtedy masz wszystko policzone bezbłędnie, tak na chłopski rozum, bo z fizyki to ja same 2 mam :/

Dawidds (Pon., 29 Lis. 10, 17:47)
#11

Się obudziłeś : D
No ale jak już mamy się czepiać to na chłopski rozum wychodząc od tego co napisałeś:

1. Chcemy obliczyć [odległość kościotrup - przyszła pozycja gracza], potrzebujemy do tego ofc:
-pozycja kościotrupa (mamy)
-przyszła pozycja gracza (nie mamy, liczymy)
2. Do obliczenia [przyszła pozycja gracza] potrzebujemy:
-kierunku gracza (mamy)
-jego prędkości (mamy)
-czasu, jaki zajmie pociskowi dotarcie do tej [przyszłej pozycji gracza] - (nie mamy, liczymy)
3. Do obliczenia [czasu jaki zajmie pociskowi dotarcie do tej [przyszłej pozycji]] potrzebujemy:
-prędkości pocisku (mamy)
-dystansu jaki musi przebyć pocisk, czyli właśnie [odległość kościotrup - przyszła pozycja gracza] - no jak nieciężko zauważyć, zapętliliśmy się.

Myślę że trochę lepszy sposób na pokazanie tego niż to co pisałem ostatnio, ale i tak gadanie nad tym jest czystą głupotą bo w 95% przypadków pocisk mimo drobnej nie-precyzji (tak, wiem, słowotwórstwo - you're doing it wrong) trafi gracza, a w pozostałych 5% gracz zrobi unik i tyle ze snajperskich zdolności szkieletu, więc naprawdę nie ma o czym gadać. Czysto matematycznie technika jest nieprecyzyjna, ale w kontekście gier i tak w 100% wystarczająca.

I end of topic, bo nie dam rady tego lepiej wytłumaczyć a na pisanie aplikacji która to zademonstruje jestem zbyt leniwy.

Najnowsze wersje GameMakera:

Stabilna
2024.2.0.132 • 2024.2.0.163
wydana 43 dni temu
LTS
2022.0.2.51 • 2022.0.2.49
wydana 182 dni temu
Beta
2024.400.0.532 • 2024.400.0.551
wydana 14 dni temu
= IDE, = Runtime
Użytkownicy online
2 użytkowników aktywnych:
gości: 1, userów: 1
 Korodzik
(~ostatnie 15 minut)
Discord
32 użytkownicy online na discordzie:
Kysiu, s..., Alice, Carl-bot, Grela, Wielki Druid, Add92, DungeonFairy🧚, Kowu, OdrzuconyKrakers, fervi, Kalor, antek, LadyLush, MKP (GEM), Pako, Arrekin, yazaa, Dyno, 🆅🅸🆃🅾74🅼, szmalu, LeD, Ulti, 🧁Cupcake🧁, bagno, Tidżi, l..., Alkapivo, moeglich, Nikas, Shockah, Kandif
Shoutbox
gnysek (20:44, 11.04.24)
Niektórzy dlatego wybierają GMEdit. Ale ja liczę na Code Editor 2, tylko na razie zbyt zbugowany jest.
Tymon (16:11, 11.04.24)
Stitch dla mnie osobiście jest lepszy bo nie musze kopać się z interfejsem GMa i mogę tylko pisać kod.
Tymon (16:05, 11.04.24)
Yes. Obecny nie jest taki zły, jak zainstalowałem najnowszą stabilną to w porównaniu z tym czego używałem... 10 lat temu...? Wszystko wydaje się lepsze.
gnysek (22:48, 10.04.24)
bscotch/stitch ? Ja czekam na fixy do nowego edytora, bo wszystko wydaje się dziś lepsze od tego obecnego :D
Tymon (19:54, 10.04.24)
Hm, Stitch okazuje się całkiem dobrą alternatywą dla wbudowanego edytora
Wojo (22:16, 08.04.24)
siemano huder myślałem, że zniknąłeś całkiem z gmclanu bo na discordzie cie nie ma :D
I am Lord (00:37, 05.04.24)
O dzięki :D
gnysek (09:58, 02.04.24)
Znalazłem na podstawie jego postów: youtube.com/@Jakim_
I am Lord (20:16, 01.04.24)
Ktoś ogarnia jakie konto miał Jakim na YT?
gnysek (16:07, 29.03.24)
Nowy Edytor kodu jednak po świętach
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?