Skocz do zawartości

Echolokator


TO_mek

Rekomendowane odpowiedzi

Witam!

Zastanawiam się jak uzyskać coś w rodzaju radaru ale nie mini mapki jak w większości gier. Chodzi mi o to aby uzyskać taki efekt:

- widok z góry, 2d,

- obiekt-gracz "strzela" z radaru,

- strzał to rozchodzący się okrąg (do jakiejś ograniczonej długości promienia, potem zanika) o grubości powiedzmy kilku pikseli,

- gdy ten okrąg napotyka na niewidoczny obiekt-przeszkodę to wtedy następuje taki efekt (2 różne pożądane rozwiązania):

-opcja 1 - okrąg zmienia w miejscu styku z danym obiektem-przeszkodą kolor na inny (ale tylko na tym łuku na którym jest kolizja z przeszkodą)

lub

-opcja 2 - następuje odbicie fali i wycinek okręgu powraca do gracza reszta kręgu (już bez tej odbitej części) dalej się rozchodzi aż zanika.

 

Poproszę o jakieś pomysły. Mile widziane przykłady.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie jest to proste, ale możliwe.

 

Na pewno nie zrobisz tego jednym obiektem/spritem/particlem.

 

masz 2 opcje:

albo robisz to obiektami (tzn sonar "wystrzeliwuje" ileś tam obiektów we wszystkie strony) i normalnie sprawdzasz kolizję

albo bierzesz particle, dodajesz changery itd. itp.

 

to drugie raczej lepsze.

Odnośnik do komentarza
Udostępnij na innych stronach

puszczanie promieni, czyli collision_line zalatwi caly problem :)

Odnośnik do komentarza
Udostępnij na innych stronach

Nie jest to proste, ale możliwe.

 

Na pewno nie zrobisz tego jednym obiektem/spritem/particlem.

 

masz 2 opcje:

albo robisz to obiektami (tzn sonar "wystrzeliwuje" ileś tam obiektów we wszystkie strony) i normalnie sprawdzasz kolizję

albo bierzesz particle, dodajesz changery itd. itp.

 

to drugie raczej lepsze.

 

 

Nie pisałem wcześniej bo nie chciałem nikogo zasugerować ale wcześniej zrobiłem coś takiego na na obiektach. Wystrzeliwuję 360 obiektów co 1 stopień (bądź wielokrotność co odpowiedni ułamek stopnia) ale boję się o prędkość działania takiego rozwiązania - puszczając 5 takich okręgów z dokładnością do pół stopnia (czyli 5 x 720 obiektów), już widać spadek fpsów a to do tego dojdzie jeszcze trochę innych obiektów i efektów.

Co do particli to tu akurat przydałby się mały przykład jak to wykorzystać.

Odnośnik do komentarza
Udostępnij na innych stronach

puszczanie promieni, czyli collision_line zalatwi caly problem :)

 

A mógłbyś nieco bardziej rozwinąć temat.

Collision_line wykrywa czy na danej linii nie ma kolizji z danym obiektem i zwraca ID tego obiektu. Czyli w efekcie mam pozycję całego obiektu-przeszkody a konkretnie jego współrzedne x,y a mnie interesuje konkretny punktu tego obiektu przeszkody (czyli miejsce kolizji) i podświetlenie tego punktu na ekranie. W kolejnym kroku chcę by podświetlony był następny punkt tej przeszkody itd. (w przypadku gdy mówimy o opcji nr 1 bo w opcji nr 2 pierwsze wykrycie kolizji ma w zasadzie podświetlić ten punkt i już dalej nie "przenikać" obiektu). Podejrzewam, że "strzelanie" tymi liniami powinno być w jakiś sposób powiązane z lenghtdirami i próbkowanie powinno następować co ustalony krok (w zależności od prędkości rozchodzenia się okręgu). Pomijam to, że im dalej od punktu wystrzału tym większe przerwy między próbkowanymi miejscami (w moim obiektowym rozwiązaniu ma to tak zrobione, że obiekty robią się coraz większe im dalej od środka okręgu).

Odnośnik do komentarza
Udostępnij na innych stronach

TO_mek, jestem prawie pewny, że jesteś multikontem któregoś admina/moda, który znęca się nad nami dając tego typu zadania. Ze wszystkich tematów, jakie założyłeś, tylko jeden dotyczył czegoś innego niż tych "trudnych spraw", jeśli się nie mylę, to była jakaś zapowiedź i nie było w niej chyba żadnego ficzera, o które nas prosiłeś.

 

Co do tematu: proponuję zrobić 32 obiekty, które będą wychodzić ze środka radaru po strzale. Daj im kształt np. łuku 11,25*.

Jak wykryją kolizję, to rób z nimi co chcesz.

Ew. możesz zrobić radar taki jak mają ci w filmach amerykańskich w łodziach podwodnych - wtedy najlepiej użyć collision_line i i obracać linię, która sprawdza kolizję. Możesz użyć skryptu na wykrywanie punktu kolizji linii z obiektem, wtedy to już będzie prościzna.

Odnośnik do komentarza
Udostępnij na innych stronach

TO_mek, jestem prawie pewny, że jesteś multikontem któregoś admina/moda, który znęca się nad nami dając tego typu zadania. Ze wszystkich tematów, jakie założyłeś, tylko jeden dotyczył czegoś innego niż tych "trudnych spraw", jeśli się nie mylę, to była jakaś zapowiedź i nie było w niej chyba żadnego ficzera, o które nas prosiłeś.

 

Co do tematu: proponuję zrobić 32 obiekty, które będą wychodzić ze środka radaru po strzale. Daj im kształt np. łuku 11,25*.

Jak wykryją kolizję, to rób z nimi co chcesz.

Ew. możesz zrobić radar taki jak mają ci w filmach amerykańskich w łodziach podwodnych - wtedy najlepiej użyć collision_line i i obracać linię, która sprawdza kolizję. Możesz użyć skryptu na wykrywanie punktu kolizji linii z obiektem, wtedy to już będzie prościzna.

 

Nie jestem multikontem :)

 

Co do radaru, podając przykład amerykański mnie oświeciłeś, że może niezbyt jasno wytłumaczyłem o co mi dokładnie chodzi. Ja chcę uzyskać w miarę szybki sposób wykrywania kolizji z obiektami (ich zarysem od strony nadchodzącej fali). Najprościej to sobie wyobrazić, że wrzucam kamień do wody który generuje falę (okrąg) która napotykając przeszkodę (u mnie są one niewidoczne) w tym miejscu "rozświetla się" i rozchodzi się dalej (opcja nr 1) lub odbija (opcja nr 2).

Na razie mam coś podobnego na obiektach z tym, że odbicia nie są realne (zmieniam kierunek o 180 stopni nie uwzględniając kąta padania).

Po dodaniu przez Was kilku pomysłów sprawdzam collision_point + lenghtdiry + zwykly draw_line co na pewno będzie dużo szybsze (chociaż na tym chyba podaruję sobie odbicia i "dziurawe" okręgi czyli opcję nr 2). Co do particli to najmniej znam temat więc zostawiam go sobie na koniec (albo może wcześniej ktoś rzuci przykładem).

Odnośnik do komentarza
Udostępnij na innych stronach

Co do poprzedniego sposobu:

CREATE:

j=0

dlugosc=128

draw:

GML
for(i=0;i<=720;i+=1) {

draw_line(x,y,x+lengthdir_x(j,i),y+lengthdir_y(j,i))

if collision_line(x,y,x+lengthdir_x(j,i),y+lengthdir_y(j,i),object1,1,1) {

kod z kolizją, a punkty kolizji to x+lengthdir_x(j,i),y+lengthdir_y(j,i)

}

}

if j>=dlugosc {

j=0

}else{

j+=1

}

EDIT:Ale lolek ze mnie zamień collsion_line na collision_point(x+lengthdir_x(j,i),y+lengthdir_y(j,i),object1,1,1)

Odnośnik do komentarza
Udostępnij na innych stronach

masz 2 opcje:

albo robisz to obiektami (tzn sonar "wystrzeliwuje" ileś tam obiektów we wszystkie strony) i normalnie sprawdzasz kolizję

albo bierzesz particle, dodajesz changery itd. itp.

 

to drugie raczej lepsze.

 

Dlatego najlepszym rozwiązanie będzie użycie particlów.

 

 

Z tego co wyczytałem to na particlach nie ma wykrywania kolizji ale mogę się mylić bo dopiero zaczynam czytać o efektach na particlach.

Możecie troszkę bardziej rozwinąć swoje wizje jak by to miało wyglądać na particlach? Czy chodzi Wam o to, żeby utworzyć efekt okręgu który się rozszerza a w miejscach obiektów utworzyć changery, które będą robiły za wykrywacze kolizji? Ale jak odwzorować dokładny kształt obiektu bo z tego co widzę to kształt changera definiuje się jako prostokąt, elipsa, rąb a moje obiekty mogą mieć dużo bardziej wymyślne kształty.

A może zupełnie nie o to chodzi.

Odnośnik do komentarza
Udostępnij na innych stronach

https://gmclan.org/up6357_12_echolokator.html

 

e: zaraz to otaguje i dam do przykladow :)

 

Fajny efekt choć nieco uproszczony ale dobrze pokazuje jak zastosować particle. Znalazłem drobiazg w create radaru, który w tym przypadku nie ma wpływu na wyświetlanie particla ale może nieco prowadzić w błąd (tym bardziej, że później w stepie wcale nawiasów nie dajesz):

GML
part_emitter_region(pss,pee,(x+lengthdir_x(odl,i))/skala,(x+lengthdir_x(odl,i))/skala,(y+lengthdir_y(odl,i))/skala,(y+lengthdir_y(odl,i))/skala,ps_shape_rectangle,0)

a raczej powinno być

GML
part_emitter_region(pss,pee,x+(lengthdir_x(odl,i)/skala),x+(lengthdir_x(odl,i)/skala),y+(lengthdir_y(odl,i)/skala),y+(lengthdir_y(odl,i)/skala),ps_shape_rectangle,0)

 

W stepie dodałem zmienne tymczasowe bo wydaje mi się, że tak będzie odrobinę szybciej, gdyż niepotrzebnie 2 razy wyliczasz składowe lenghtdir

GML
var _x, _y, _xs, _ys;

for(i=0;i<360;i+=1){

_x:=lengthdir_x(odl,i);

_y:=lengthdir_y(odl,i);

if(collision_point(xx+_x,yy+_y,sciana,0,1)){

_xs:=_x/skala;

_ys:=_y/skala;

// part_emitter_region(pss,pee,x+(_x/skala),x+(_x/skala),y+(_y/skala),y+(_y/skala),ps_shape_rectangle,0) //bez uzycia zmiennych _xs i _ys - nawiasy powinny byc tak lub pominiete

part_emitter_region(pss,pee,x+_xs,x+_xs,y+_ys,y+_ys,ps_shape_rectangle,0)

part_emitter_burst(pss,pee,ptt,1)

}

}

if(odl<maxodl){

odl+=1;

}else{

odl=0;

}

xx=hero.x;

yy=hero.y;

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