TO_mek Opublikowano 14 Lipca 2013 Udostępnij Opublikowano 14 Lipca 2013 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 . 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 Więcej opcji udostępniania...
szmalu Opublikowano 14 Lipca 2013 Udostępnij Opublikowano 14 Lipca 2013 Możesz wykorzystać collision_circle Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Threef Opublikowano 14 Lipca 2013 Udostępnij Opublikowano 14 Lipca 2013 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(). Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TO_mek Opublikowano 14 Lipca 2013 Autor Udostępnij Opublikowano 14 Lipca 2013 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 Więcej opcji udostępniania...
Threef Opublikowano 14 Lipca 2013 Udostępnij Opublikowano 14 Lipca 2013 Na szybko zrobiłem coś takiego Nie jest to doskonały skrypt ale powinien Ci zobrazować jak rozwiązać ten problem. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
szmalu Opublikowano 15 Lipca 2013 Udostępnij Opublikowano 15 Lipca 2013 Przecież równie dobrze po przecięciu z collision_circle może oddział być atakowany aż do momentu przecięcia się z okręgiem drugi raz. Serio wtedy dużo straci na wydajności, czy co? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 15 Lipca 2013 Udostępnij Opublikowano 15 Lipca 2013 point_distance jest o wiele wydajniejsze niż collision_circle. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Threef Opublikowano 15 Lipca 2013 Udostępnij Opublikowano 15 Lipca 2013 A poza tym TO_mek chce sprawdzać drogę przez wyruszeniem. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ereg Opublikowano 15 Lipca 2013 Udostępnij Opublikowano 15 Lipca 2013 jesli chcesz testovac trojkot KNN po pixelach v kazdym STEP, to masz problem. jak vystarczy czas od czasu przetestovac KNN to moze byc cos takiego Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TO_mek Opublikowano 15 Lipca 2013 Autor Udostępnij Opublikowano 15 Lipca 2013 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 Więcej opcji udostępniania...
ereg Opublikowano 15 Lipca 2013 Udostępnij Opublikowano 15 Lipca 2013 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 Więcej opcji udostępniania...
TO_mek Opublikowano 29 Lipca 2013 Autor Udostępnij Opublikowano 29 Lipca 2013 zobacyles moj przyklad? Tak i nieco go zmodyfikowałem ale znowu mam dosyć istotny błąd. Najpierw rysunek: 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 Więcej opcji udostępniania...
ereg Opublikowano 29 Lipca 2013 Udostępnij Opublikowano 29 Lipca 2013 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 Więcej opcji udostępniania...
TO_mek Opublikowano 29 Lipca 2013 Autor Udostępnij Opublikowano 29 Lipca 2013 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 Więcej opcji udostępniania...
ereg Opublikowano 30 Lipca 2013 Udostępnij Opublikowano 30 Lipca 2013 zycze sczescia przy lowu BUGow :thumbsup: 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ę