/l/l-ichał Opublikowano 29 Stycznia 2009 Udostępnij Opublikowano 29 Stycznia 2009 Witam. Mam problem z częścią sztucznej inteligencji postaci. Mam postać "A", dwie postacie "B" oraz ścianę. Napisałem: Jeżeli postaci "A" ściana nie zasłania postaci "B" to strzela do najbliższej postaci "B". Wszystko działa. Ale jeżeli są dwie postacie "B", jedna jest za ścianą bliżej niż to widoczna, to strzela do tej, której nie widzi. Wiem w czym polega błąd ale nie wiem co zrobić. :( Proszę o wykazanie się pomysłami i dobrym sercem. :) Oczywiście za udaną pomoc wpis w autorach. :thumbsup: Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
borubarartur Opublikowano 29 Stycznia 2009 Udostępnij Opublikowano 29 Stycznia 2009 To musisz sprawdzić czy najbliższa postać B jest za ścianą czy nie, jak jest to strzela a jak nie to szuka następnej, najlepiej jakbyś dał jakąś część kodu. I pytanie, korzystałeś z instance_nearest? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Makary155 Opublikowano 29 Stycznia 2009 Udostępnij Opublikowano 29 Stycznia 2009 (edytowane) Użyj collision_line i te które nie zasłania ściana sprawdzaj pętlą który jest najbliżej i niech strzela do niego. Edit: jaka pętla? Help-rozdział o instance_find Edytowane 29 Stycznia 2009 przez Makary155 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
/l/l-ichał Opublikowano 29 Stycznia 2009 Autor Udostępnij Opublikowano 29 Stycznia 2009 Tak użyłem instance_nearest oraz !colission_line. Próbowałem pętli ale jakoś mi nie wychodziło. A oto skrypty: postać "A" (step) GML if (instance_exists(obj_potwor3)) {dis = point_distance(x,y,obj_potwor3.x,obj_potwor3.y)} if dis < max_distance * 1 {zasieg=true} else {zasieg = false} najpotwor3 = instance_nearest(x,y,obj_potwor3) postać "A" alarm[1] GML if (zasieg=true) {if instance_exists(obj_potwor3) {if (!collision_line(x,y,obj_potwor3.x,obj_potwor3.y,obj_mur,true,true)) {instance_create(x,y,obj_pocisk_sojusznika)}}} alarm[1]=40 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Makary155 Opublikowano 29 Stycznia 2009 Udostępnij Opublikowano 29 Stycznia 2009 Skopiuj tą pętlę z helpa. Wywal instance_nearest. W pętli for przed if(iii.power>maxpower) daj if collision_line. Teraz zamień zwrot na <. Maxpower ustaw duży, np. 10000. zamień maxpower=iii.power na maxpower=iii.distance_to_object(A) Sprawdź, nie jestem pewien. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
/l/l-ichał Opublikowano 29 Stycznia 2009 Autor Udostępnij Opublikowano 29 Stycznia 2009 Przepraszam ale trochę nie zajarzyłem, o którą pętlę z helpa chodzi? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Makary155 Opublikowano 29 Stycznia 2009 Udostępnij Opublikowano 29 Stycznia 2009 Rozdział the game maker language-game play-instances Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
/l/l-ichał Opublikowano 29 Stycznia 2009 Autor Udostępnij Opublikowano 29 Stycznia 2009 Ok widzę, zobaczę czy działa. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
/l/l-ichał Opublikowano 29 Stycznia 2009 Autor Udostępnij Opublikowano 29 Stycznia 2009 Taki niefajny błąd mi wyskoczył. FATAL ERROR in action number 1 of Step Event for object obj_sojusznik: COMPILATION ERROR in code action Error in code at line 20: {maxid = iii; maxpower = iii.distance_to_object(obj_potwor3)} at position 39: Variable name expected. P.S (sorki za double posta) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Makary155 Opublikowano 29 Stycznia 2009 Udostępnij Opublikowano 29 Stycznia 2009 Czyli adresowanie nie halo. Zrób tak: wstaw w step obj_potwor3 takie coś distance=distance_to_object(obj_sojusznik) i teraz zamień tamto na maxpower=iii.distance i niech zacznie strzelac w strone maxid.x i maxid.y Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
/l/l-ichał Opublikowano 29 Stycznia 2009 Autor Udostępnij Opublikowano 29 Stycznia 2009 Kurcze kolejny błąd ale tamtego nie mia. ERROR in action number 1 of Step Event for object obj_sojusznik: Error in code at line 16: if (iii.object_index == unit) at position 30: Unknown variable unit P.S. - dzięki za poświęcenie swojego czasu Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Danielus Opublikowano 29 Stycznia 2009 Udostępnij Opublikowano 29 Stycznia 2009 "nieznana zmienna unit" nie masz czegos takiego jak unit ;) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
/l/l-ichał Opublikowano 29 Stycznia 2009 Autor Udostępnij Opublikowano 29 Stycznia 2009 najwidoczniej nie :) a nie ma jakiegoś prostszego skryptu? coś w stylu: najbliższy = "najbliższy(używając instance_nearest), który nie jest za ścianą(używając !colission_line)"?? Może nie byłoby to profesjonalne ale za to skuteczne. Dzięki Makery155, ale najwyraźniej mnie to przewyższa. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
don_soyer Opublikowano 29 Stycznia 2009 Udostępnij Opublikowano 29 Stycznia 2009 to do step obiektu a: var in; in=instance_nearest(x,y,b) if !collision_line(x,y,in.x,in.y,c,0,1) then { var bu; bu=instance_create(x,y,bullet) bu.direction=point_direction(x,y,in.x,in.y) bu.speed=30 } a - obiekt A b - obiekt B c - obiekt sciana bullet - obiekt pocisk dodaj do tego can_shot czy soc takiego, zeby nie strzelal ciagle bez przerwy dodam ze z pamieci pisane. zobacz Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
/l/l-ichał Opublikowano 29 Stycznia 2009 Autor Udostępnij Opublikowano 29 Stycznia 2009 Dzięki pewnie będzie działać jednak odpowiem później bo teraz nie mam dostępu do GM. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
don_soyer Opublikowano 29 Stycznia 2009 Udostępnij Opublikowano 29 Stycznia 2009 ok ok ;] sposob latwy, musi dzialac Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Makary155 Opublikowano 29 Stycznia 2009 Udostępnij Opublikowano 29 Stycznia 2009 (edytowane) Rzeczywiście, proste. A ja mu chciałem mulić z pętlami. Sory za wprowadzanie w błąd, ale jakbyś wywalił tą linijkę z unit to by i moje działało. Dziwne, czasem pociski lecą nie tam gdzie trzeba jak wpisałem ten kod u siebie Edytowane 29 Stycznia 2009 przez Makary155 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
/l/l-ichał Opublikowano 29 Stycznia 2009 Autor Udostępnij Opublikowano 29 Stycznia 2009 Już nie strzela do przeciwnika, który jest bliżej ale za ścianą kiedy widzi dalszego, jednak niestety do tego dalszego strzela tylko wtedy kiedy to on jest tym najbliższym(instance_nearest). (mam nadzieję, że zrozumieliście) Oczywiście może to być również moja wina. Jednak za każdym razem tak jest, a poza tym wszystko działa. Bardzo proszę o wyjaśnienie w czym jest błąd. P.S. - oto skrypt od "eltix" po drobnych modyfikacjach GML if instance_exists(obj_potwor3) { var in; in=instance_nearest(x,y,obj_potwor3) if !collision_line(x,y,in.x,in.y,obj_mur,1,0) then { var bu; bu=instance_create(x,y,obj_pocisk_sojusznika) bu.direction=point_direction(x-16,y-16,in.x,in.y) bu.speed=8 }} Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Makary155 Opublikowano 29 Stycznia 2009 Udostępnij Opublikowano 29 Stycznia 2009 Może jednak moja pętla?:) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
/l/l-ichał Opublikowano 29 Stycznia 2009 Autor Udostępnij Opublikowano 29 Stycznia 2009 Możliwe jednak mam błąd z tym unit. Jeżeli trzeba tylko usunąć to zobaczę. Edit: Nie zgadniesz co się stało po usunięciu unit. Kolejny błąd. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Makary155 Opublikowano 29 Stycznia 2009 Udostępnij Opublikowano 29 Stycznia 2009 To nie gadaj tylko zapodawaj, osochozzi Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
/l/l-ichał Opublikowano 29 Stycznia 2009 Autor Udostępnij Opublikowano 29 Stycznia 2009 Skrypt: GML{ maxid = -1; maxpower = 10000; for (i=0; i { iii = instance_id; if (!collision_line(x,y,obj_potwor3.x,obj_potwor3.y,obj_mur,true,true)) {if (iii.power < maxpower) {maxid = iii; maxpower=iii.distance} } } } Kiedy sojusznik widzi wroga błąd. ERROR in action number 1 of Step Event for object obj_sojusznik: Error in code at line 19: {if (iii.power < maxpower) at position 17: Unknown variable power Jest to trochę zawiłe, jednak jeżeli mi ktoś z tym pomoże to powinno mi zadziałać. Łatwiejszy jest skrypt eltixa, jednak nie działa a twórca się nie odzywa. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
don_soyer Opublikowano 30 Stycznia 2009 Udostępnij Opublikowano 30 Stycznia 2009 Już nie strzela do przeciwnika, który jest bliżej ale za ścianą kiedy widzi dalszego, jednak niestety do tego dalszego strzela tylko wtedy kiedy to on jest tym najbliższym(instance_nearest). (mam nadzieję, że zrozumieliście) nie kapuje Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Makary155 Opublikowano 30 Stycznia 2009 Udostępnij Opublikowano 30 Stycznia 2009 If iii.distance<maxpower w collision_line zamień obj_potwór na iii. Wiesz co, pogłówkuje nad tym i na wieczór dam ci gotowca, okiej? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
/l/l-ichał Opublikowano 30 Stycznia 2009 Autor Udostępnij Opublikowano 30 Stycznia 2009 Makary155: Jasne, jeżeli Ci się uda to będę twoim dłużnikiem :thumbsup: eltix: Spróbuje to wyjaśnić. "A" strzela do "B" którego nie zasłanie "C" tylko w tedy kiedy jest bliżej od tego drugiego "B", którego zasłania "C". A - postać strzelająca B - cele (dwa) C - ściana Bardziej nie umiem tego opisać. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
don_soyer Opublikowano 30 Stycznia 2009 Udostępnij Opublikowano 30 Stycznia 2009 ok ok. juz widze. narazie nie mam czasu w ogole, bo jutro sesja cdn :( jak znajde chwile to zobacze Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
/l/l-ichał Opublikowano 30 Stycznia 2009 Autor Udostępnij Opublikowano 30 Stycznia 2009 Jasne jak będziesz miał czas to zobacz o co chodzi ,a na razie się ucz. :D Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Makary155 Opublikowano 30 Stycznia 2009 Udostępnij Opublikowano 30 Stycznia 2009 Ok, chyba się udało. Testowałem najpierw czy narysuje strzałkę do poprawnego objecta. Przetestowałem nawet z kilkoma objectami gracza. step potwora: blah=instance_nearest(x,y,obj_gracz) distance=point_distance(x,y,blah.x,blah.y) step gracza maxid=-1 iii=-1 mindistance=10000 for(i=0;i<instance_count;i+=1) { iii=instance_id if(iii.object_index== B) { if(!collision_line(x,y,iii.x,iii.y,C,0,1)) { if(iii.distance<mindistance) {maxid=iii;mindistance=iii.distance} o=instance_create(x,y,bullet) o.direction=point_direction(x,y,maxid.x,maxid.y) o.speed=9 }}} B to potwór, C to ściana, obj_gracz to ten co strzela Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
/l/l-ichał Opublikowano 30 Stycznia 2009 Autor Udostępnij Opublikowano 30 Stycznia 2009 Co ma być zamiast B) ?? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Makary155 Opublikowano 30 Stycznia 2009 Udostępnij Opublikowano 30 Stycznia 2009 B. Forum mi to wstawiło. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi