Skocz do zawartości

Shooter - Sterowanie


Rekomendowane odpowiedzi

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

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

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

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

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

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

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

xAdVKkR.png

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

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

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

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

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