Exigo Opublikowano 15 Stycznia 2009 Udostępnij Opublikowano 15 Stycznia 2009 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 Więcej opcji udostępniania...
Dawidds Opublikowano 15 Stycznia 2009 Udostępnij Opublikowano 15 Stycznia 2009 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 Więcej opcji udostępniania...
Uzjel Opublikowano 15 Stycznia 2009 Udostępnij Opublikowano 15 Stycznia 2009 użyj mp_potential_step_object Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Marek.S Opublikowano 15 Stycznia 2009 Udostępnij Opublikowano 15 Stycznia 2009 spróbuj" GML (GdziesWstep) dir = dir mod 360 if ( dir < 0 ) dir = 360 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Exigo Opublikowano 15 Stycznia 2009 Autor Udostępnij Opublikowano 15 Stycznia 2009 Działa, lecz gdy wartość dir "przeleci" przez 0 to kręci się w zupełnie inną stronę. :/ PS: Zdaje mi się że ten temat był kiedyś poruszony ale za nic nie mogę go znaleźć. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawidds Opublikowano 15 Stycznia 2009 Udostępnij Opublikowano 15 Stycznia 2009 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 Więcej opcji udostępniania...
Exigo Opublikowano 15 Stycznia 2009 Autor Udostępnij Opublikowano 15 Stycznia 2009 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 Więcej opcji udostępniania...
Dawidds Opublikowano 15 Stycznia 2009 Udostępnij Opublikowano 15 Stycznia 2009 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 Więcej opcji udostępniania...
Harrrry Opublikowano 15 Stycznia 2009 Udostępnij Opublikowano 15 Stycznia 2009 https://forum.gmclan.org/index.php?showtopic=14141 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę