Skocz do zawartości

Obiekt posiadający swoje pole grawitacyjne


Rekomendowane odpowiedzi

Witam, z uwagi na hobby GM robię sobie co jakiś czas jakąś gierkę, ale mam problem z obiektem dającym osobno ujemne pole grawitacyjne:

 

Mam podstawową postać, i chcę by zbliżając się do jakiegoś obiektu zostawała by odpychana.

Próbowałem robić z distance_to_object, ale jedynie postać po osiągnięciu odległości wyznaczonej stawała w miejscu, i nic się nie dało zrobić...

 

I moje pytania rodzące się to:

1) Czy da się zrobić to z funkcją instance_nearstep

2) Jak ta funkcja w ogóle działa ? :o

 

PS. Wiem, troszkę bez ładu, ale inaczej tego napisać nie potrafiłem :/

Odnośnik do komentarza
Udostępnij na innych stronach

Ustawiaj obiektom w jakimś zasięgu direction przeciwne niż point_direction do tego obiektu, i jakieś friction żeby sobie pojeździły, zamiast nienaturalnie się zatrzymywać po chwili.

No i speed tym większy im bliżej się znalazł obiekt.

Odnośnik do komentarza
Udostępnij na innych stronach

GML
if distance_to_object(costam) < 100

{

move_towards_point(ludzik.x,Ludzik.y,-5)

}

 

Chodzi o cos takiego ?

Z tym zatrzymywaniem sie to jeszcze pomysle co zrobic.

 

Mozesz zrobic cos takiego:

 

GML
if distance_to_object(costam) < 100

{

move_towards_point(ludzik.x,Ludzik.y,-5)

 

if Ludzik.x > costam.x

{

if speed = 0

{

x+= 10

}

}

}

Odnośnik do komentarza
Udostępnij na innych stronach

Powyższy kod opiera się na warunku i z tego względu nie daje efektu płynnego przyciągania (odpychania) obiektów. Można to zrobić na bazie wiedzy z fizyki. Wektorowo:

 

giflatexl.gif

 

gdzie sumarycznie wszystko poza odległością r (promień wodzący) od obiektu jest włączone do stałej.

 

Model opiera się na poniższym kodzie stworzonym bezpośrednio na podstawie powyższego wzoru. Dodajmy do kodu głównego pewne stałe.

 

Create:

GML
acceleration_direction=0

acceleration_value=0

acceleration_factor=-0.02

distance_divisor=100

distance_shift=20

 

Dodawanie wektorowe umieszczamy oczywiście w Step:

 

GML
acceleration_direction=point_direction(x,y,attractor.x,attractor.y)

acceleration_value=1/power((distance_shift+point_distance(x,y,attractor.x,attractor.y))/distance_divisor,2)

motion_add(acceleration_direction,acceleration_value*acceleration_factor)

 

gdzie attractor to obiekt generujący pewne pole grawitacyjne (bardziej by pasowało słowo elektryczne z racji odpychania ;)). Bawiąc się parametrami, możemy otrzymać różne modele odpychania (silne/gładkie/prawie jednorodne). Ujemny acceleration_factor oznacza odpychanie się obiektów. Parametr distance_shift pozwala uniknąć dzielenia przez 0 przy teoretycznie zerowej odległości, jest to stała wartość dodawana do promienia. Na nasze warunki wzór będzie wyglądał następująco:

 

giflatexr.gif

 

gdzie iloczyn acceleration_factor*power(distance_divisor,2) jest pewną stałą.

 

Przykład: https://gmclan.org/up506_14_accel.html

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...