Skocz do zawartości

AI - wyszukiwanie kolizji drogi z kołowym zasięgiem strzału


TO_mek

Rekomendowane odpowiedzi

Witam!

Mam kilka obiektów "W" - wieże, które maja kołowy zasięg strzału. W jaki sposób najprościej wyszukać obiekty "W", które podczas wysyłania oddziału z punktu "K" do punktu "N" (linia prosta) będa w stanie trafiać w taki oddział czyli wtedy gdy droga biegnie wewnątrz kolistego zasięgu strzału.

Najlepiej zerknąć na rysunek kolizje.png.

Czerwona linia to obszar w którym nasz wędrujący oddział jest narażony na strzał. Same obiekty mają niewielkie maski (załózmy, że wielkości ich symbolu "K", "W", "P", "N") więc proste collision_line nie wyszuka obiektów "W". Idelanie byłoby gdyby znaleźć oba punkty przecięcia się zasiegu wieży z drogą oddziału.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie, nie, nie. Nie ważne czy chcesz to robić przed czy podczas ruchu to korzystaj z point_distance(), i iteruj przez wszystkie obiekty W przy pomocy instance_find().

 

Musze sprawdzać przed wysłaniem i obliczyc jak długo oddział będzię pod ostrzałem aby oszacować opłacalność ataku. Czyli mam przeliczac sciezkę i dla każdego kroku sprawdzać point_distance dla każdego z wież? Jak to wpłynie na fpsy (zarówno wież jak i wysyłanych oddziałów będzie sporo więcej)?

Odnośnik do komentarza
Udostępnij na innych stronach

A nie można jakoś wyliczyć tych dwóch punktów czyli poczatku i końca czerwonego odcinka? Potrzebuję to wyliczać jeszcze przed wysłaniem oddziału z pkt "K" do pkt "N" i jeśli straty będą zbyt duże to wybrać inny cel (np ten drugi pkt "N" na przykładowym rysunku).

 

Podobnie obliczam straty na odcinku od punktu przecięcia okręgu do jego środka (w momencie gdy celem oddziału jest jakś wieża czyli punkt "W"), ale to akurat jest prostsze bo gdy wiem, że celem jest wieża to wyliczam straty z długości promienia okręgu (czyli zasiegu strzału wieży, siły pocisków, prędkości tych pocisków i szybkostrzelności).

Odnośnik do komentarza
Udostępnij na innych stronach

zobacyles moj przyklad?

v nim mouse vybiera direction a nastepnie liczy(po pixelach) ile przesedl mimo zasieg W i ile pixeli byl v wszystkich W circle

 

niejest to za szybkie, ale pare razy na step niema problemu

 

po nacisniecu SPACE emitue solidery ktorzy liczo natomiast czas(step=punkt) spedzony v zasiegu W.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 tygodnie później...
zobacyles moj przyklad?

 

Tak i nieco go zmodyfikowałem ale znowu mam dosyć istotny błąd.

Najpierw rysunek:

wieze_blad.png

 

Z lewej fioletowy domek to baza gracza (CEL), z prawej niebieski baza komputera (ATAKUJACY), oraz 3 wieże. Linia to droga od atakującego do celu. Okregi to zasięg strzału wież.

 

Skrypt w obecnej wersji wywoływany jest z bazy wroga. Argument0 okresla tylko ktory skrypt ma byc wybrany z wielu wersji jaka powstala do tej pory. Argument 1 to ID docelowej bazy gracza (fioletowy domek), argument 2 to predkość oddziału (w moim przypadku 0.5 ale dla uproszczenia niech bedzie 1). Kolizja to licznik zliczający (w tej wersji skryptu) ile razy oddzial na drodze bedzie w zasięgu strzału wieży

 

GML
if argument0 == 0 then {

//****************************** DROGA_W_ZASIEGU calkiem pierwsza wersja - ZMIENIANY

var _idc, _o_speed, _dist, _direct,_frames_to_hit, _p_ilosc, _p_moc, _x, _y, _kolizja, _o_speed;

_idc:=argument1;//ID Celu

_o_speed:=argument2;//Predkosc oddzialu

_kolizja:=0;

_direct:=point_direction(_idc.x,_idc.y,x,y);//odwrotnie ma znaczenie!!!

_dist:=point_distance(_idc.x,_idc.y,x,y);// point_distance(x,y,_id_nno.x,_id_nno.y) // jaka odleglosc dzieli bazy (atakujaca i docelowa)

for (i=0; i<_dist; i+=_o_speed){

_x=x-lengthdir_x(i,_direct);

_y=y-lengthdir_y(i,_direct);

var _nobj;

_nobj:=instance_nearest(_x, _y, wieza_obj);

// if (distance_to_object(_nobj)<_nobj.zasieg_x) then {

if (point_distance(_x,_y,_nobj.x,_nobj.y)<_nobj.zasieg_x) then {

_kolizja++;

//war_poi+=1;

}else {

//peace_poi+=1;

}

}

 

Każdą z wież analizowałem pojedynczo (czyli zasięgi się nie nakładały tak jak na rysynku).

I teraz dla wieży środkowej, której średnica zasięgu to równocześnie droga czyli w tym przypadku 416 pikseli skrypt liczy idealnie czyli _kolizja=415 (lub dla _o_speed=0.5 wynik to 831).

Dla wieży dolnej długość drogi w zasięgu wynosi dokładnie 286px i tu wynik kolizji też powinien wynosić 285 (lub dla _o_speed=0.5 dwukrotność czyli 571). Niestety wynik w tym przypadku to 164 (w przypadku _o_speed=0.5 wynosi 328).

 

Może mi ktoś wytłumaczyć o co tu chodzi?

Odnośnik do komentarza
Udostępnij na innych stronach

jest mozlive ze origin vojska jest na 0,0?

to by linia drogi szla o jakies kilka pixeli v gore.

 

moze sproboj wyrysovac ktoredy script spravdza droge?

niech ci vyrysuje, bywa to pomocne.

 

nielatwo osodzic, co i kdzie jescze moze byc zle

Odnośnik do komentarza
Udostępnij na innych stronach

jest mozlive ze origin vojska jest na 0,0?

to by linia drogi szla o jakies kilka pixeli v gore.

 

moze sproboj wyrysovac ktoredy script spravdza droge?

niech ci vyrysuje, bywa to pomocne.

 

nielatwo osodzic, co i kdzie jescze moze byc zle

Origin wojska jest 16,26 przy sprajcie 32,32 więc linia się zgadza z ta wyrysowaną. Zresztą dodałem rysowanie czerwonej linii (punkt po punkcie) podczas wykonywania skryptu i linie sie pokrywają wewnątrz zasiegu.

 

 

PS. Moment bo jednak coś sie rozsypuje dopiero gdy na ekranie jest więcej wież niż 1. Akurat ten skrypt liczy wszystko dobrze więc ja muszę mieć coś w kolejnych wersjach namieszane.

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