Skocz do zawartości

Atakowanie najbliższego obiektu który nie jest za ścianą


Rekomendowane odpowiedzi

Hejka all, mam mały problem.

Zrobiłem obiekt A, obiekt B oraz ścianę, chcę aby obiekt A atakował najbliższy obiekt b który nie jest za ścianą, napisałem taki kod w obiekcie A

if point_distance(x,y,instance_nearest(x,y,obiektB).x,instance_nearest(x,y,obiektB).y) <100
{
if !collision_line(x,y,instance_nearest(x,y,obiektB).x,instance_nearest(x,y,obiektB).y,sciana,1,1)
{
akcja atakowania
}
}

Wszystko jest dobrze, dopóki nie pokarze sie drugi dalszy obiekt B, tak jak na obrazku poniżej

problemzestrategia.jpg

Obiekt A nie atakuje obiektu B który jest wyrzej, poniewarz pomiędy nimi jest ściana, nie atakuje też niższego Obiektu B, poniewarz ten obiekt wyżej jest bliżej. Daltego pytam, jak zrobić by obiekt A atakował obiekt b który jest niżej? Mam nadzieje że mnie rozumiecie.

Odnośnik do komentarza
Udostępnij na innych stronach

Kodem nie pomoge, ale moge pomsylem. Zrobilbym tablice przechowywujaca id wszystkich obiektow B. Nastepnie zmienna (np. id_ ) z poczatkowa wartoscia -1, albo noone i sprawdzanie po kolei calej tablicy, czy obiekt pod tym indeksem nie jest za sciana i czy jest blizszy A niz obiekt zapisany w id_. Jezeli tak to teraz jego id zapisujemy do zmiennej. Dzieki temu mamy id najblizszego obiektu, ktory nie jest za sciana w var. Jezeli id_ ma wartosc poczatkowa to, albo nie ma obiektow, albo wszystkie sa za sciana.

 

Napisalbym kod, ale nie wiem jak zrobic tablice z id obiektow. Jezeli ich ilosc bylaby znana daloby sie, ze kazdy obiekt B podczas create zapisuje swoje id w tab[ instance_count ], albo jakos tak.

Odnośnik do komentarza
Udostępnij na innych stronach

https://gmclan.org/up78_11_moving.html

 

Ma pare wad, ale dziala... Np. 100 elementowa tablica, ktore nie zawsze sa wykozystywane.

 

EDIT: Zapomnialbym. Jezeli obiektow h ( u Ciebie A ) ma byc wiecej niz jeden to radze stworzyc osobny ( np. objControl ) do przechowywania tablicy, ktory bedzie ja uaktualnial itd... Bo jezeli tego nie zrobisz to bedzie (100 * ilosc_obiektow) elementow. ^-^ Tablica ta przechowuje niby kilka cyferek, ale sa one uaktualniane w kazdym stepie, a (Kilka cyferek * 100 * ilosc obiektow ) zmieniane tyle razy na sekunde robi sowje... 100 to limit obiektow danego typu, wiec jezeli przewidujesz wiecej zmien to.

Odnośnik do komentarza
Udostępnij na innych stronach

Tworzenie listy:

 id_l = ds_list_create(); //id_l pewnie dasz global

 

Create B:

 ds_list_add( id_l; id );

 

Petla:

var i, t;

t = ds_list_find_value( id_l, i )
if ( !collision_line( x, y, t.x, t.y, m, 1, 1 ) ) id_ = dis[0];


for ( i = 1; i < ds_list_size(id); i += 1 )
{
t = ds_list_find_value( id_l, i )
if (  !collision_line( x, y, t.x, t.y, m, 1, 1 ) && ( distance_to_object( t ) < distance_to_object( id_ ) ) )
id_ = t;
}

if ( id_ != noone )
move_towards_point( id_.x, id_.y, 3 );

 

Game end:

 ds_list_destroy( id_l );

 

Nie mam pojecia czy dziala. Nie moge sprawdzic bo mam GM unreg, wiec nie mam mozliwosci uzywania list (szkoda :( ). Dzieki nim nie musisz sie martwic o rozmiar jak w przypadku tablic. Mysle, ze bedzie sporo wydajniejsze.

Odnośnik do komentarza
Udostępnij na innych stronach

Trochę nie kapuje :huh: , ale mam pytanie, czy jest możliwe zrobić coś takiego, że obiekt A będzie atakował obiekt B którego id ma zapisane, a będzie miał zapisane id tego obiektu, który bedzie spełniał jakieś warunki. Da się coś takiego zrobić? jeśli tak to porszę o kod, bo sam nie potrafie przenieść tego na kod. <_<

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