Skocz do zawartości

płynne przejście do ruchu po okręgu


Nubosabuk

Rekomendowane odpowiedzi

witam! jest to mój pierwszy post, lecz forum przeglądam już jakiś czas. W końcu zabrałem się za projekt, z którego kiedyś może coś będzie. Póki co wszystkie problemy rozwiązywałem szukając odpowiedzi na podobne pytania lecz z tym problemem już nie wiem co robić. Problem jest taki: statkiem kosmicznym porusza się przy użyciu prędkości oraz kierunku, lecz chciałbym żeby statek po zbliżeniu się do gwiazdy/planety wpadł w jej "pole grawitacyjne" i zaczął poruszać się ruchem po okręgu do czasu, aż gracz zwiększy prędkość i odleci statkiem z pola grawitacyjnego. Napisałem kod, w którym ruch po okręgu udało się osiągnąć lecz nie potrafię naprowadzić statku tak, aby łagodnie przeszedł z ruchu liniowego w ruch okrężny. Statek przeskakuje, czasem się zacina i chaotycznie się porusza w polu oddziaływania.  Poradźcie mi jakich funkcji/sztuczek użyć by osiągnąć mój cel. Nie wiem czy to coś pomoże, ale wrzucam mój kod(działałem troche po omacku więć wyszło to co wyszło :) ).

GML
//spotkanie z gwiazda

var _id,odl;

_id=instance_nearest(x,y,obj_gwiazda); //zapisanie id gwiazdy do zmiennej

odl=point_distance(x,y,_id.x,_id.y) //obliczenie odległości od gwiazdy

if odl<=_id.r*10 and speed<5

{

if odl>_id.r*5 //resetowanie zmiennych po opuszczeniu orbity

{

orbita=false;

ww=false;

}

//zblizanie sie do orbity gwiazdy po stycznej do orbity

if direction< point_direction(x,y,_id.x,_id.y) and orbita==false //jezeli kierunek podchodzenia jest mniejszy od kierunku na gwiazde to pojazd zbliza sie stycznie z lewej strony

{

mp_linear_step(_id.x+lengthdir_x(_id.r*5,direction-90),_id.y+lengthdir_y(_id.r*5,direction-90),speed,false)

orbita=true;

}

if direction>= point_direction(x,y,_id.x,_id.y) and orbita==false// to samo ale z prawej

{

mp_linear_step(_id.x+lengthdir_x(_id.r*5,direction+90),_id.y+lengthdir_y(_id.r*5,direction+90),speed,false)

orbita=true;

}

if orbita==true and odl<=_id.r*5

{

if ww==false

{

w=direction; //nadanie wartości poczatkowej dla kata obrotu

ww=true

}

x=_id.x+lengthdir_x(_id.r*5,w);

y=_id.y+lengthdir_y(_id.r*5,w);

w+=speed; //kat obrotu

direction=w+90;

}

}

Odnośnik do komentarza
Udostępnij na innych stronach

Można prosić screen jak z planszy, żebym widział, jak to graficznie się prezentuje + zasady sterowania? Przede wszystkim zrezygnowałbym ze struktury warunkowej i wprowadził jeden skrypt odpowiadający za cały ruch statku, który byłby wektorowym złożeniem ruchu własnego oraz ruchu wynikającego z istnienia pola grawitacyjnego.

 

Kod odpowiedzialny za to będzie zależał do tego, w jaki sposób zaprogramowałeś sterowanie. I pytanie - co chcesz uzyskać: samo przejście do ruchu obrotowego czy cały ruch "z przyciąganiem", którego jednym z elementów jest właśnie przechodzenie w ruch obrotowy?

Odnośnik do komentarza
Udostępnij na innych stronach

Zgadzam się z Jakimem, jeżeli chodzi o tego typu gry kosmiczne to przetworzenie paru wzorów fizycznych jest chyba najlepszym pomysłem (nie mniej jednak jednym z trudniejszych). Ja bym to zrobił tak:

 

- W obiekcie statku w create wpisz motion_set(0, 0);

- Zrobić zwykłe sterowanie do okrętu (tzn sterowanie na strzałkach, czy myszą, jak tam masz, ale przez funkcję motion_add (dodawanie wektorów))

- Rzucił okiem na ten artykuł: Przyśpieszenie grawitacyjne

- Za G wstaw co tam chcesz (chociażby 1), możesz tą wartością ustawić faktyczne przyśpieszenie grawitacyjne, potrzebne ci tylko masa planet i gwiazd (też użyj jakiejś umownej skali)

- Niech każdy większy obiekt (np planeta) posiada w create wpisaną swoją masę, a w step ten wzór, który będzie przyciągał twój statek również przez funkcję motion_add(tutaj wpisz ten wzór, tutaj point_direction od statku do planety)

 

W ten sposób masz wprowadzone do swojej gry namiastkę przyśpieszenie grawitacyjnego :) . Teraz zależy, czy chcesz, żeby to faktyczne miało tak wyglądać (obiekt sam nie wejdzie w ruch po okręgu, trzeba go ustawić w pierwszej prędkości kosmicznej do danego ciała niebieskiego, nie wiem czy widziałeś, jak np NASA to robi (obrót silników przeciwnie do lotu i full burn :) ))

Odnośnik do komentarza
Udostępnij na innych stronach

chciałem aby ten ruch nie był skomplikowany tak i dla mnie jak i dla gracza. Zabawa z grawitacją na pewno była by ciekawa, ale chyba póki co chciałbym zrobić coś takiego:

aaaqe.gif

statkiem porusza się na zasadzie:

strzałka w przód/w dół- speed+/-=przyspieszenie, strzałka lewo/prawo- direction+/-=jakaśtamliczba.

chciałbym aby statek w pewnej odległości od gwiazdy skierował się w stronę orbity tak, aby dotrzeć na nią prostej stycznej do okręgu orbity- w ten sposób statek gwałtownie nie zmieni swojego kierunku tak, jak to by było w wypadku, gdyby statek po dotarciu np prostopadle do orbity zaczął naglę poruszać się ruchem po okręgu(widać by było szybki przeskok i zmiene kierunku lotu o 90 stopni)

czyli:

1. w przestrzeni poruszamy się strzałkami

2. w pewnej odległości od gwiazdy, gdy kierunek statku "celuje" w gwiazdę kierunek zmienia się na kierunek stycznej do okręgu orbity

3. po dotarciu do punktu na orbicie, ruch stałby się ruchem po okręgu

Odnośnik do komentarza
Udostępnij na innych stronach

Aaa, taki autopilot? Też może być przy czym musisz określić dokładnie jakie warunki wpływają na przejście do ruchu po okręgu (wciskanie klawiszy, średnia odległość, szybkość, kąt obrotu). Sprawa też jest łatwa, ciekaw jestem tylko, czy jeżeli zbliży się do gwiazdy to całkiem odbierzesz mu kontrolę nad jednostką.

 

I jeszcze jedno, czy kierunek silników = kierunek lotu, czy istnieje u ciebie bezwładność. Jeśli nie to sprawa jest banalna i może już nawet powiedzieć jak :) :

image2.jpg

Punkt do którego ma lecieć pojazd wyznaczasz jako przesunięcie punktu o wektor (dokładniej środka planety o pewną długość w określonym kierunku (niebieski)). Długość obliczasz z funkcji trygonometrycznych znając długość czerwonego, oraz różnice między kątem czerwonym i zielonym. Z kolei kąt jest równy kątowi zielonemu + 90° * sign(kąt zielony - kąt czerwony). Jeśli będzie z prawej strony to zielony kąt będzie mniejszy, czyli będzie -90, jeśli z drugiej to odwrotnie. Jedyny problem to to, kiedy masz zamiar przejąć kontrolę nad sterowaniem pojazdu.

 

Na tej zasadzie znajdzie ci punkt do którego ma lecieć, aby rozpocząć lot po okręgu. Potem kontrolę nad ruchem powinien przejąć inny algorytm bo ten może powodować problemy (jeśli pojazd ustawi się prostopadle do osi (czyli kąty zielony - czerwony = +/-90) to ten sposób wyznaczy ci punkt dokładnie w którym jest pojazd. Gorzej, jeśli kąt będzie >90°, wtedy program zawróci pojazd by znaleźć sie na niższej orbicie). Z resztą - sam sprawdź :) . Uważaj tylko na kąty w stylu 359 - 0, są barrrdzo zdradliwe :D .

Odnośnik do komentarza
Udostępnij na innych stronach

no mam w kodzie coś takiego co tak działa- wykorzystałem lenghdiry. Problem pojawia się w momencie gdy statek jest już na orbicie i pałeczkę przejmuje algorytm odpowiedzialny za ruch po okręgu, zdarza się, że przejście zostanie wykonane w miare płynnie ale zazwyczaj statek wariuje:) właśnie zaczynam kolejne podejście do problemu może coś wykminię, albo może zastosuję tak jak podpowiedziałeś grawitację i inne fizyczne sprawy :)

 

EDIT: Udało się! Tak jak doradziłeś użyłem grawitacji i pierwszej prędkości kosmicznej, okazało się to dużo prostsze niż sądziłem.Może jeszcze nie mam do końca tego czego oczekiwałem, ale jest co najmniej zadowalająco. dzięki:)

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