Skocz do zawartości

Kierunek: "Coś"... ale nie od razu


Exigo

Rekomendowane odpowiedzi

Zróbmy zmienną... dir = point_direction(blabla).

Ok. Mamy dwa obiekty... pierwszy ma ten kod, drugi - po prostu istnieje.

Obiekt ustawia ten "dir" na jakiś tam obiekt... wszystko ładnie.

Sęk w tym żeby "dir" się zmieniał stopniowo. Przykład:

 

dir = point_direction(blabla)

if dir<=dir2

{dir+=1;}

itd.

 

Wyobraźcie sobie rakietę która ma słabą "skrętnośc" - tak to ujmę. Ta widzi wroga... i skręca, ale stopniowo. O to mi chodzi w pewnym sensie. :twisted:

 

Kod ten oczywiście nie działa bo jak wiadomo, zmienna dir będzie miała wartości od 0 do 360 i wszystko zaczyna się po chwili walić. Da się ten problem jakoś rozwiązać?

Odnośnik do komentarza
Udostępnij na innych stronach

Najprościej?

1. Robisz sobie funkcję angle_difference() (to chyba umiesz zrobić...?)

2. I porównujesz - jeśli po dodaniu do zmiennnej dir dowolnej wartości (niech będzie 1, cho w rzeczywistości pewniej jest dać 0.000001 :P) jest ona bliżej celu

( if(angle_difference(dir, cel_dir)+1 < angle_difference(dir, cel_dir)) )

(czyli różnica od mojego dira do celu jest mniejsza, niż normalnie), to znaczy, iż muszę do zmiennej dodawać wartość.

Jeśli nie jest większa, muszę odejmować.

 

To najprostsze rozwiązanie (inaczej - najprostsze do zrozumienia) - mogę tu zarzucić kodem, ale chcę, abyś coś zrozumiał... ;P

 

edit: Lol, co ja gadam... ;P

Wystarczy porównać, czy różnica kątów jest mneijsza, czy większa od 0... -.-'

Coś mi się pokiełbasiło :D

Odnośnik do komentarza
Udostępnij na innych stronach

Jeny...

 

GML
//angle_difference(dir1, dir2);

return (((argument0 - argument1) mod 360) + 360+180) mod 360) - 180;

 

//Step:

if(angle_difference(my_dir, cel_dir) < 0){ my_dir += 1; }

else if(angle_difference(my_dir, cel_dir) > 0){ my_dir -= 1; }

 

Edit: Czasem warto przed jakąkolwiek operacją na kątach dać zwykłe

while(dir < 0){ dir += 360; }

...bo czasami się błędy robią :P

Odnośnik do komentarza
Udostępnij na innych stronach

Beautiful :*

Oczywiście nie obejdzie się bez następnego problemu. ^^ Więc tak...

Skręca to troszeczkę zbyt sztywno... Kombinowałem z dzieleniem wartości by zwiększyć płynność, ale jak wskoczyło na wartość minusową to zaczęły się cuda dziać. Da się jakoś temu zaradzić? :D

Odnośnik do komentarza
Udostępnij na innych stronach

Ehhh...

 

Nie wiem do końca, co masz na myśli przez płynność.

Do długości płynności (że tak to nazwę :P) zmieniającej się dynamicznie najlepiej pasuje najlepiej chyba właśnie dzielenie wartości... ;P

 

Przyjrzyj się np. takiemu kodowi:

GML
mx = max(min(mouse_x, view_xview[0]+ 800), view_xview[0]); //Nie patrz na ten kod - to jest po prostu pozycja myszki. Ale aby nie można było się rozglądać tak daleko, aby nie było widać na ekranie gracza - zabezpieczam pozycję myszki przed wyjściem poza obszar view'a.

my = max(min(mouse_y, view_yview[0]+600), view_yview[0]);

if(1) //O lol, nie patrz na to :P tu kiedyś był kod, ale w czasie pisania usunąłem warunek, a później nie chciało mi się tabulatorów cofać xd...

{

xx = (obj_player.x+mx)/2; //To jest CEL (do tego ma się ekran płynnie przesuwać, to jest jakby "koniec" ruchu)

yy = (obj_player.y+my)/2; //To samo, tyle, że y

if(xx < x){ xx -= (xx-x)/1.1; } //Tego wyjaśniać mi się nie chce - musisz sam przeanalizować. Od wartości 1.1 zależy płynność ruchu.

if(xx > x){ xx += (x-xx)/1.1; }

if(yy < y){ yy -= (yy-y)/1.1; }

if(yy > y){ yy += (y-yy)/1.1; }

x = xx; //zamiast x powinno być view_xview[0], ale, aby kod nie był zbyt długi dałem to jako x.

y = yy;

}

//(object following jest ustawiony na obj_camera)

To jest kod na przesuwanie się viewa zależnie od pozycji myszki - żeby w widoku topdown można się było jakoś "rozglądać". Takie proste, a jak umila życie... przy okazji jest tam płynność ruchu.

 

Nie będę ci pisał tego odrazu pod direction - pomyśl trochę sam... :)

 

Edit: Co się stało z kolorowaniem składni... Oo

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