Micanser Opublikowano 25 Listopada 2006 Udostępnij Opublikowano 25 Listopada 2006 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 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 Więcej opcji udostępniania...
Nicolas Opublikowano 25 Listopada 2006 Udostępnij Opublikowano 25 Listopada 2006 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 Więcej opcji udostępniania...
Micanser Opublikowano 25 Listopada 2006 Autor Udostępnij Opublikowano 25 Listopada 2006 Ilość obiektów B i A nie będzie znana, bo ta gra to ma być cos w rodzaju strategii. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Nicolas Opublikowano 25 Listopada 2006 Udostępnij Opublikowano 25 Listopada 2006 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 Więcej opcji udostępniania...
Micanser Opublikowano 25 Listopada 2006 Autor Udostępnij Opublikowano 25 Listopada 2006 Bardzo wielkie dzięki! :thumbsup: EDIT: Czy mógł byś mi to trochę dokładniej wytłumaczyć? (chodi mi o kod w pliku) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Filar Społeczności Ranmus Opublikowano 25 Listopada 2006 Filar Społeczności Udostępnij Opublikowano 25 Listopada 2006 Zamiast tablicy lepiej jest użyć listę, mniej kłopotów będzie. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Micanser Opublikowano 25 Listopada 2006 Autor Udostępnij Opublikowano 25 Listopada 2006 Postanowiłem ukończyć mój stary projekt https://forum.gmclan.org/index.php?showtopi...43&hl=wojny , obiekt B to miał być aniemiec a obiekt A to aliant, moze teraz będzie wam łatwiej mi wytłumaczyć co i jak. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Nicolas Opublikowano 25 Listopada 2006 Udostępnij Opublikowano 25 Listopada 2006 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 Więcej opcji udostępniania...
Micanser Opublikowano 25 Listopada 2006 Autor Udostępnij Opublikowano 25 Listopada 2006 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 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ę