Skocz do zawartości

Zablokowane Strzelanie Do Najbiższego, Widocznego Wroga.


Rekomendowane odpowiedzi

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

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

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

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

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

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

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 przez Makary155
Odnośnik do komentarza
Udostępnij na innych stronach

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

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

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

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

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...