TO_mek Opublikowano 29 Lipca 2011 Udostępnij Opublikowano 29 Lipca 2011 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 Więcej opcji udostępniania...
Rudy Opublikowano 29 Lipca 2011 Udostępnij Opublikowano 29 Lipca 2011 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 Więcej opcji udostępniania...
PsichiX Opublikowano 29 Lipca 2011 Udostępnij Opublikowano 29 Lipca 2011 puszczanie promieni, czyli collision_line zalatwi caly problem :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TO_mek Opublikowano 29 Lipca 2011 Autor Udostępnij Opublikowano 29 Lipca 2011 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 Więcej opcji udostępniania...
ediepl Opublikowano 29 Lipca 2011 Udostępnij Opublikowano 29 Lipca 2011 Dlatego najlepszym rozwiązanie będzie użycie particlów. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TO_mek Opublikowano 29 Lipca 2011 Autor Udostępnij Opublikowano 29 Lipca 2011 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 Więcej opcji udostępniania...
Muuuuczek567 Opublikowano 29 Lipca 2011 Udostępnij Opublikowano 29 Lipca 2011 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 Więcej opcji udostępniania...
TO_mek Opublikowano 29 Lipca 2011 Autor Udostępnij Opublikowano 29 Lipca 2011 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 Więcej opcji udostępniania...
ediepl Opublikowano 29 Lipca 2011 Udostępnij Opublikowano 29 Lipca 2011 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 Więcej opcji udostępniania...
TO_mek Opublikowano 2 Sierpnia 2011 Autor Udostępnij Opublikowano 2 Sierpnia 2011 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 Więcej opcji udostępniania...
ediepl Opublikowano 2 Sierpnia 2011 Udostępnij Opublikowano 2 Sierpnia 2011 Masz racje, nie da się zrobić wykrywania kolizji w patriclach, post wyżej masz kod który "wystrzeliwuje" piksele i sprawdza kolizje,dzięki czemu możesz sprawdzić dokładny punkt tej kolizji. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TheMarcQ Opublikowano 2 Sierpnia 2011 Udostępnij Opublikowano 2 Sierpnia 2011 https://gmclan.org/up6357_12_echolokator.html e: zaraz to otaguje i dam do przykladow :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 2 Sierpnia 2011 Udostępnij Opublikowano 2 Sierpnia 2011 Wow zrobiłem coś podobnego, ale u ciebie to super wyszło :thumbsup: . Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TO_mek Opublikowano 3 Sierpnia 2011 Autor Udostępnij Opublikowano 3 Sierpnia 2011 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 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ę