projektgryweebly Opublikowano 20 Sierpnia 2015 Udostępnij Opublikowano 20 Sierpnia 2015 Witam, chciałbym wykonać pewien system sterowania do mojej strzelanki. Postaram się opisać, o co mi chodzi: Jest to gra z widokiem z góry, biegamy, strzelamy i takie tam...wiadomo ;D, chciałbym, aby sterowanie odbywało się na takiej zasadzie, jak w grach FPS, to znaczy - mam ten widok z góry, gracz znajduje się w centrum, widok podąża za graczem, a nad graczem jest celownik, chciałbym, aby gdy obrócę myszą np. w lewo to gracz i celownik stały stabilnie w pionie, ale obracał się widok ( Tak jak w FPS-ach, krzyżowy celownik jest w centrum obrazu, a broń na dole, one nie zmieniają swojej pozycji na ekranie, ale możemy celować, poruszać się itp. Chciałbym uzyskać podobny efekt w mojej grze, dużo kombinowałem z view_angle, prawie to wychodziło, ale obraz zaczynał dziwnie skakać i wszystko się rozmazywało, drgając nawet, gdy nie poruszałem myszą. Chodzi mi o to, aby uzyskać efekt podobny do tego : Ale, aby gracz i celownik były całkowicie stabilne. Jeżeli ktoś jest w stanie pomóc, będę bardzo wdzięczny, pozdrawiam. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kt1117 Opublikowano 20 Sierpnia 2015 Udostępnij Opublikowano 20 Sierpnia 2015 Mój pomysł jest taki. Dajesz celownik Create GML mouse_delta=0 mouse_xprevious=-1; wsp=0.5//daj tu coś sensownego camspeed=20;//i tu też insensitivitist=2;//j.w. Begin Step GML if (mouse_xprevious!=-1) mouse_delta=mouse_x-mouse_xprevious; if (abs(mouse_delta)<insensitivitist)) mouse_delta=0; //tu sobie ustaw pozycje myszki jak chcesz (nie pamiętam jak to było) Step GML view_angle[0]+=min(abs(mouse_delta)*wsp,camspeed)*sign(mouse_delta); hero.direction+=mouse_delta*wsp;//bohater musi się obrócić razem z view hero.image_angle+=mouse_delta*wsp;//obrazek też End Step GML mouse_xprevious=mouse_x; Draw GUI GML draw_sprite(view_wview[0]/2,view_hview[0]/4,sprite_celownika);//tu też sobie zmień To taki koncept tylko Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am Lord Opublikowano 21 Sierpnia 2015 Udostępnij Opublikowano 21 Sierpnia 2015 Na ludum dare robiłem taki motyw, jest tam source https://forum.gmclan.org/index.php?showtopi...p;hl=ludum+dare Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
projektgryweebly Opublikowano 21 Sierpnia 2015 Autor Udostępnij Opublikowano 21 Sierpnia 2015 I Am Lord, dokładnie o to mi chodziło ! Wielkie dzięki !!! P.S skąd mogę pobrać taką wersję GM, aby otworzyć ten projekt ? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am Lord Opublikowano 21 Sierpnia 2015 Udostępnij Opublikowano 21 Sierpnia 2015 chyba importować trzeba w GMS Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
projektgryweebly Opublikowano 22 Sierpnia 2015 Autor Udostępnij Opublikowano 22 Sierpnia 2015 Twój projekt jest świetny, uzyskałeś w nim efekt, którego szukałem, ale za nic nie mogę połapać się w kodzie ;x. Uzyskałem ten efekt poruszania się, ale za pomocą klawiatury: if (keyboard_check(vk_left)) { view_angle[0]-=3; } if (keyboard_check(vk_right)) { view_angle[0]+=3; } I tutaj moje pytanie: Co wykombinować, aby zastąpić klawiaturę myszką ? Pociągnę lekko w lewo, to view_angle[0]-=3, w prawo to view_angle[0]+=3 ? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am Lord Opublikowano 23 Sierpnia 2015 Udostępnij Opublikowano 23 Sierpnia 2015 Ja zrobiłem tak że myszka obraca postać gracza a kamera stara się nadążyć za jego kierunkiem. Dlatego obrót nie jest taki sztywny. Obrót gracza jest w: oPlayer EndStep oPlayer Step > Chodzenie GML (oPlayerStep) if ( mouseDelta > 0 ) { angle += min(mouseDelta, rotspd); } if ( mouseDelta < 0 ) { angle += max(mouseDelta, -rotspd); } GML (oPlayerEndStep) /// mouse lock if ( !window_has_focus()) mouseBlock = false; if ( mouseBlock ) { xpos = display_get_width()*0.5; ypos = display_get_height()*0.5; mouseDelta = (xpos - display_mouse_get_x())*0.5; display_mouse_set( xpos, ypos ); } A obrót kamery w o_hud Step GML (ohudStep) if ( instance_exists(oPlayer) ) { view_xview2 = oPlayer.x - view_wview/2 + lengthdir_x( 50, oPlayer.angle ); view_yview2 = oPlayer.y - view_hview/2 + lengthdir_y( 50, oPlayer.angle ); view_xview = lerp(view_xview, view_xview2, 0.4); view_yview = lerp(view_yview, view_yview2, 0.4); // obracanie do angle gracza view_angle2 = -oPlayer.angle+90; view_angle = lerp(view_angle, view_angle2, 0.35); } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
projektgryweebly Opublikowano 23 Sierpnia 2015 Autor Udostępnij Opublikowano 23 Sierpnia 2015 Ok, są pierwsze pozytywne rezultaty ;D, kamera obraca się tak jak powinna, ale pojawia się problem - podczas obracania cały obraz nieco się zniekształca, wyciąga i wgl. Rozmiar widoku to 1920x1080. Natomiast, gdy ustawie rozmiar widoku 1000x1000 problem znika, ma to jakiś związek z proporcją długości do szerokości, bo w kwadratowym widoku wszystko działa cacy ;D. P.S Istnieje jakaś funkcja, żeby poruszać graczem według osi lokalnej obiektu, a nie globalnej, mam gracza i jak dam mu pod literą A x-=5 to po obróceniu widoku będzie poruszał się w innym kierunku, co zrobić, aby gracz zawsze odchodził w lewo bez względu na położenie kamery ? + Jak wygląda sprawa z GUI, próbowałem na próbę wstawić obiekt, który zastepuje pasek życia, ale za nic nie chce podążać za kamerą i jej obrotami. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
projektgryweebly Opublikowano 24 Sierpnia 2015 Autor Udostępnij Opublikowano 24 Sierpnia 2015 Zlikwidowałem problem ze zniekształceniem obrazu, teraz można się oglądać dookoła 360 i chodzić do przodu/tyłu, ale nie wiem co zrobić, aby poruszać się na boki, ten skrypt z twojego projektu nie chce mi działać. + Co zrobić, aby gracz znajdował się w dolnej części ekranu, tak jak w twoim projekcie, u mnie znajduje się on w centrum ? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am Lord Opublikowano 24 Sierpnia 2015 Udostępnij Opublikowano 24 Sierpnia 2015 P.S Istnieje jakaś funkcja, żeby poruszać graczem według osi lokalnej obiektu, a nie globalnej, mam gracza i jak dam mu pod literą A x-=5 to po obróceniu widoku będzie poruszał się w innym kierunku, co zrobić, aby gracz zawsze odchodził w lewo bez względu na położenie kamery ? masz tam jakaś swoją zmienną odpowiedzialną za obrót sprita gracza? Dla przykładu w moim projekcie jest to zmienna "angle" U siebie posłużyłem się tygonometrią: GML if ( keyboard_check(ord('A')) ) { spd = walkspd; posX += cos((-angle-90)*d2r)*spd; posY += sin((-angle-90)*d2r)*spd; } if ( keyboard_check(ord('D')) ) { spd = walkspd; posX += cos((-angle+90)*d2r)*spd; posY += sin((-angle+90)*d2r)*spd; } if ( keyboard_check(ord('W')) ) { spd = walkspd; posX += cos(-angle*d2r)*spd; posY += sin(-angle*d2r)*spd; } if ( keyboard_check(ord('S')) ) { spd = walkspd; posX += -cos(-angle*d2r)*spd; posY += -sin(-angle*d2r)*spd; } "d2r" to stałe zdefiniowane w oknie macros po shift+crtl+N jest to konwersja ze stopni na radiany ale ty możesz się posłużyć funkcjami lengthdir_x(dlugosc_wektora, kat_wektora_w_stopniach); lengthdir_y(dlugosc_wektora, kat_wektora_w_stopniach); więcej info tutaj https://forum.gmclan.org/index.php?showtopi...=lengthdir+info + Co zrobić, aby gracz znajdował się w dolnej części ekranu, tak jak w twoim projekcie, u mnie znajduje się on w centrum ? u mnie jest to tutaj: w o_hud GML view_xview2 = oPlayer.x - view_wview/2 + lengthdir_x( 50, oPlayer.angle ); view_yview2 = oPlayer.y - view_hview/2 + lengthdir_y( 50, oPlayer.angle ); te lengthdiry to powodują, jak usuniesz to też będzie w centrum. To działa tak że najpierw kamera ustawia się w centrum gdzie gracz stoi: oPlayer.x - view_wview/2 oPlayer.y - view_hview/2 a potem przesuwa się o 50 pixeli z miejsca gdzie gracz stoi w jego kierunku, tutaj trzeba potestować z kątem bo nieraz musi być ujemny albo dodać +180. To zależy od tego w jaki sposób masz sprity porobione. Czy domyślnie postać jest obrócona w prawo czy nie. + lengthdir_x( 50, oPlayer.angle ); + lengthdir_y( 50, oPlayer.angle ); Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
projektgryweebly Opublikowano 24 Sierpnia 2015 Autor Udostępnij Opublikowano 24 Sierpnia 2015 Wszystko pięknie śmiga, aż się łezka w oku kręci :D, ale za nic nie mogę ogarnąć tego poruszania się na boki. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am Lord Opublikowano 25 Sierpnia 2015 Udostępnij Opublikowano 25 Sierpnia 2015 Wszystko pięknie śmiga, aż się łezka w oku kręci :D, ale za nic nie mogę ogarnąć tego poruszania się na boki. musisz przesuwać postać w 2 pozycjach jednocześnie. przykład dla ruchu na bok w prawo W osi X to będzie +lengthdir_x(szybkosc, kat_patrzenia_sie_gracza+90) W osi Y to będzie +lengthdir_y(szybkosc, kat_patrzenia_sie_gracza+90) przykład dla ruchu na bok w lewo W osi X to będzie +lengthdir_x(szybkosc, kat_patrzenia_sie_gracza-90) W osi Y to będzie +lengthdir_y(szybkosc, kat_patrzenia_sie_gracza-90) przykład dla ruchu do tyłu W osi X to będzie +lengthdir_x(szybkosc, kat_patrzenia_sie_gracza+180) W osi Y to będzie +lengthdir_y(szybkosc, kat_patrzenia_sie_gracza+180 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
projektgryweebly Opublikowano 26 Sierpnia 2015 Autor Udostępnij Opublikowano 26 Sierpnia 2015 Poruszanie się działa bez zarzutów, dzięki :thumbsup: . Pojawia się kolejny problem z systemem HUD, mam obiekt, który jest np. ikonką profilu i przy obracaniu kamerą ucieka on gdzieś poza widok, chciałbym, żeby znajdował się on zawsze w lewym górnym rogu widoku, jak to wykonać ? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am Lord Opublikowano 26 Sierpnia 2015 Udostępnij Opublikowano 26 Sierpnia 2015 Rysować go w Draw GUI Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
3r3se7ven Opublikowano 29 Sierpnia 2015 Udostępnij Opublikowano 29 Sierpnia 2015 Przed rzuceniem tego na draw_step warto przecedzieć co ma być rysowane i gdzie. Dobre do tego jest trzymanie elementów do narysowania w ds_list czy innej strukturze danych. Pozwala to skalować widok ("zoom") bez szkody dla fizyki (i bez używanai draw_gui, które to teraz jest, a w następnej wersji może być popsute lub wyparować, bo YoYo już różne rzeczy w historii się odwidziały i odpalenie niektórych starych gratów wymaga ich redagowania) i całkowicie oddzielić rysowanie (prezentację wyniku) od tego co się dzieje w fizyce gry. 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ę