Skocz do zawartości

Jak sprawdzać który obiekt jest aktualnie w kolizji


Flame

Rekomendowane odpowiedzi

Dobry,

Zrobiłem mały kodzik dot. podążania za postacią przez przeciwnika. Kodzik generalnie polega na tym żeby przeciwnik nie zobaczył postaci przez ścianę więc dałem tę linijeczkę:

GML (step obiektu obj enemy)
if !collision_line(x,y,x+lengthdir_x(range,dir),y+lengthdir_y(range,dir),obj_wall,false,true) && distance_to_object(obj_character)<distance_to_object(obj_wall)

problem w tym że distance_to_object(obj_wall) nie odnosi się do ściany w zasięgu widzenia a najbliższej, która nie koniecznie jest w zasięgu linii. Z tego też powodu mimo tego, że nawet jeśli zasięg wzroku koliduje z jakąś ścianą lecz postać jest przed nią, przeciwnik nie reaguje ze względu na ścianę np. obok niego, która jest bliżej niż sama postać. Próbowałem coś robić z id obj_wall ale nie wyszło to najlepiej :/

 

tutaj cały kodzik:

GML (step obiektu obj enemy)
dir=point_direction(x,y,obj_character.x,obj_character.y);

 

if instance_exists(obj_character)

{

if !collision_line(x,y,x+lengthdir_x(range,dir),y+lengthdir_y(range,dir),obj_wall,false,true) && distance_to_object(obj_character)<distance_to_object(obj_wall)

{

if collision_line(x,y,x+lengthdir_x(range,dir),y+lengthdir_y(range,dir),obj_character,false,true) then seen=true;

else seen=false;

}

else seen=false;

}

else seen=false;

 

if seen==true mp_potential_step_object(obj_character.x,obj_character.y,spd,obj_wall);

 

Dołączam SS z opisanej wyżej sytuacji: link

Odnośnik do komentarza
Udostępnij na innych stronach

Źle się do tego zabierasz. Za pomocą !collision_line, powinienes sprawdzic kolizje miedzy wrogiem a graczem, a jezeli kolizji nie ma, dopiero wtedy sprawdzic czy dystans miedzy wrogiem a graczem jest mniejszy lub rowny maksymalnemu zasiegowi wzroku:

GML
if !collision_line(x,y,obj_character.x,obj_character.y,obj_wall,false,true) && distance_to_obect(obj_character) <= MaxZasiegWidokuWPikselach

{

// Zobaczyl gracza

}

Odnośnik do komentarza
Udostępnij na innych stronach

Dodatkowo collision_line() zwróci ci ID obiektu który przeszkadza na lini. Mając te ID możesz sprawdzać sobie dystans pomiędzy obj_character a tym konkretnym kawałkiem ściany który blokuje pole widzenia.

 

No i jeżeli w distance_to_object() (albo jakiejkolwiek innej funkcji) podasz nazwę obiektu a nie ID instance, to funkcja odniesie się do pierwszej instance tego obiektu która istniała w room i nie jest nie aktywna. Nie odnosi się wcale do najbliższej instance.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie zrozumiałeś mnie :) (albo ja ciebie xD)

 

Potrzebuje mieć zwracane id obj_walla który koliduje z linią jego wzroku. Bez tego gra bierze najbliższą ścianę, która niekoniecznie znajduje się w zasięgu jego linii wzroku przez co przeciwnik nie atakuje. Chodzi o to, że gdy postać jest za ścianą(czyli jest dalej niż ściana w jego linii wzroku), przeciwnik nie atakuje, a gdy jest przed ścianą (co nie znaczy, że kolizji ze ścianą już nie ma) przeciwnik atakuje. Nie wiem jak mam zwrócić sobie id tego właśnie pojedyńczego bloku ściany który jest w kolizji z linią wzroku przeciwnika i o to właśnie pytam :jezor:

A w jaki sposób odczytać ID z collision line. Collision line nie zwraca tru/false ?

Odnośnik do komentarza
Udostępnij na innych stronach

Nie wiem jak mam zwrócić sobie id tego właśnie pojedyńczego bloku ściany który jest w kolizji z linią wzroku przeciwnika i o to właśnie pytam :jezor:

zmienna = collision_line(x,y,x+lengthdir_x(range,dir),y+lengthdir_y(range,dir),obj_wall,fa

lse,true)

 

Zapraszam do dokumentacji.

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