Skocz do zawartości

Obroty


Platyna

Rekomendowane odpowiedzi

Witam

 

Mam takie pytanie:

Jeśli mam jakiś kąt docelowy i kąt aktualny to jak zrobić by on wybierał w którą stronę ma się obrócić by dotrzeć do docelowego (tak by było mu bliżej). Czyli jeśli:

aktualny - 90

docelowy 0

 

to muszę zmniejszać image_angle

 

a aktualny 59

docelowy 92

to ma zwiększać image_angle

 

Ale nie można tego załatwić zwykłym

if(cel>image_angle)

image_angle+=1

else

image_angle-=1

 

bo gdybym tak robił to w przypadku

 

aktualny 0

docelowy 350

 

zaczą by dodawać image_angle i obracać się o całe 350 stopni zamiast o tylko 10 w tronę przeciwną :/

 

Wie ktoś jak to załatwić?

 

Z góry dzięki :thumbsup:

Odnośnik do komentarza
Udostępnij na innych stronach

directionto = point_direction(x,y,obj_monster.x,obj_monster.y);
if direction > directionto then direction -= 6;
if direction < directionto then direction += 6;
if direction > 360 then direction -= 360;
if direction < 0 then direction += 360;
image_angle = direction;

 

Trochę zmieniony kod kompasu z mojej gry (a żem wtedy wymyślił, że kompas pokazuje najbliższego wroga :D ).

U mnie działało dobrze.

Odnośnik do komentarza
Udostępnij na innych stronach

To co żeś napisał to dokładnie to samo co ja powiedziałem że jest złe.

No bo pomyśl.

gdy igła twojego kompasu zechce obrócić się do 350 z pozycji 10 to wykona obrót 340 (350>10) zamiast 20 w drugą stronę :/

Odnośnik do komentarza
Udostępnij na innych stronach

Phi! Tez mi problem... -.-

 

stworz skrypt: direction_check_near

o kodzie:

// argument0 - aktualny direction
// argument1 - docelowy direction

var temp_a,temp_b;
temp_a=abs(argument1-argument0)
temp_b=abs(argument1-argument0+360)
if(temp_a<temp_b)return(1)
if!(temp_a<temp_b)return(-1)

 

funkcja zwraca 1 gdy jest najblizej wartosci dodatnio zorientowanej, zas -1 gdy ujemnie zorientowanej (byc moze nie zrozumiesz).

 

Przyklad wykorzystania:

dir1=10
dir2=350
dir1+=direction_check_near(dir1,dir2)*10

Powinno dzialac ;)

Odnośnik do komentarza
Udostępnij na innych stronach

Nie działa. Nie zawsze obraca się w tą krótszą stroną. Czasem w tą w którą mu dalej.

 

Chyba niczego nie sknociłem w tym co mi dałeś:

 

if(image_angle!=(round(dir/5))*5)
{
temp_a=abs(dir-image_angle)
temp_b=abs(dir-image_angle+360)

if(temp_a<temp_b)
image_angle+=5
else
image_angle-=5

if(image_angle>360)
image_angle-=360
else if(image_angle<0)
image_angle+=360
}

Odnośnik do komentarza
Udostępnij na innych stronach

Gdy jest napisane STWORZ SKRYPT to postepujemy zgodnie z instrukcja i go tworzymy. Po to jest on by bylo latwiej -.- Powinno dzialac, zreszta zaraz sprawdze

Odnośnik do komentarza
Udostępnij na innych stronach

Weź to nawet przeanalizuj dla tych przykładowych wartości 10 i 350. Powinien obracać się w prawo czyli odejmować od image_angle.

 

temp_a=350-10=340

temp_b=350-10+360=700

 

340<700 (temp_a<temp_b)

 

if(temp_a<temp_b)return(1)

 

Sam widzisz że źle :/

Odnośnik do komentarza
Udostępnij na innych stronach

faktycznie, dopiero sprawdzilem :P ale co za problem pokombinowac z tym? Ja teraz nie mam czasu, przykro mi

Odnośnik do komentarza
Udostępnij na innych stronach

Dobra, jak widze twoje podejscie do sprawy to az mi sie zal robi... Zaraz dostaniesz rozwiazanie, ale na przyszlosc nie poddawaj sie na trudnych przeszkodach, bo w zyciu nic nie zrobisz

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy
Myślałem, że to nie będzie dla forumowiczów problemem, a tu widzę że na razie nikt nie potrafi mi pomóc :(

 

dopiero co dostałeś jedno ostrzeżenie, już chcesz kolejne ? drugi raz w ciągu jednego dnia łamiesz regulamin - pisząc dwa posty pod rząd.

Odnośnik do komentarza
Udostępnij na innych stronach

Hmm... Też miałem taki problem, ale nie potrafiłem (Tymonowi XD) wytłumaczyć o co mi chodzi XD Teraz jak mam sporo doświadczenia to mogę pokombinować. Dam edita jak coś wykminię...

 

alfa = 10

beta = 350

To są te kąty.

 

a - odległość przeciwna do ruchu wskazówek zegara

b - odległość zgodna z ruchem wskazówek zegara

a = beta - alfa = 350 - 10 = 340

b = 360 - beta + alfa = 360 - 350 + 10 = 10 + 10 = 20

a > b

Więc poruszamy się zgodnie z RWZ

jeśli a < b to poruszamy się przeciwnie do RWZ

 

Tak więc mniej więcej kod będzie wyglądał tak:

alfa = image_angle;
beta = cel;

if (beta = 0)
beta = 360;

a = beta - alfa;
b = 360 - beta + alfa;

if (a>b)
image_angle -= 4;
if (a<b)
image_angle += 4;

poprawione Dodaj jeszcze gdzieś w stepie

if (image_angle>=360)

image_angle -= 360;

if (cel>=360)

cel -= 360;

 

Teoretycznie... Nie mogę na tym kompie tego sprawdzić, bo coś się roztegowało (jakiś plik został usunięty) i nie działaja niektóre programy.

Odnośnik do komentarza
Udostępnij na innych stronach

W create coś takiego (Wartości sam ustal)

mp_potential_settings(10,10,0,0)

 

W step:

mp_potential_step(obj_wrog.x,obj_wrog.y,0,true)
image_angle = direction

 

i to cała filozofia :)

Pokombinuj trochę z tymi wartościami w mp_potential_settings żeby Ci pasowały

pozdrawiam Uzjel ;)

 

EDIT:

 

No i przykład - taki trochę na odwal - ale pokazuje to co trzeba ;)

Przykład - OxGames

Odnośnik do komentarza
Udostępnij na innych stronach

Matthew, twój kod nie był całkowicie dobry, a wręcz był niedobry, ale to twój sposób myślenia mnie doprowadził do rozwiązania.

Problem rozwiązany dziękuję wszystkim za pomoc :)

A gnyska chciałbym przeprosić. Już nie będę. Nawet nie zauważyłem, że dostałem to ostrzeżenie i do tej pory bym nie wiedział jak byś mi znów uwagi nie zwrócił, tak więc przepraszam i dziękuję jeszcze raz wszystkim :)

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