Skocz do zawartości

Chodzenie za myszą w 3D


Rekomendowane odpowiedzi

Witam , otóż mam problem .

Zrobiłem obiektowi obracanie kamierą , ale chciałbym aby po naciśnięciu klawisza :

 

W - szedł przed siebie

A - szedł w lewo

D - szedł w prawo

S - szedł do tyłu

 

 

 

12:48 EDIT :

 

Z jakiegoś tutoriala wyciągłem

 

Chodzenie w lewo i prawo tak to wygląda :

 

W lewo :

GML
{

var xn,yn;

xn = x - sin(direction*pi/180);

yn = y - cos(direction*pi/180);

if not place_meeting(xn,yn,obj_wall_basic)

{ x = xn; y = yn; }

}

 

 

W prawo:

GML
{

var xn,yn;

xn = x + sin(direction*pi/180);

yn = y + cos(direction*pi/180);

if not place_meeting(xn,yn,obj_wall_basic)

{ x = xn; y = yn; }

}

 

Ale nie wiem co jest w tym kodzie na dole nie tak , bo na tutorialu obiekt szedł przed siebie i po puszczeniu klawisza stawał , a umnie ciągle idze ;/

 

Tak wygląda kod :

 

GML
{

var maxspeed;

if keyboard_check(vk_shift) maxspeed = 3 else maxspeed = 1.5;

if (speed < maxspeed ) speed = min(maxspeed ,speed+0.4);

}

Odnośnik do komentarza
Udostępnij na innych stronach

GML
if ( keyboard_check( ord('W') ) ) {

x+= cos( CamDirZ * pi/180 )*Speed;

y+= sin( CamDirZ * pi/180 )*Speed;

}

if ( keyboard_check( ord('S') ) ) {

x+= -cos( CamDirZ * pi/180 )*Speed;

y+= -sin( CamDirZ * pi/180 )*Speed;

}

if ( keyboard_check( ord('A') ) ) {

x+= cos( (270 + CamDirZ) * pi/180 )*Speed;

y+= sin( (270 + CamDirZ) * pi/180 )*Speed;

}

if ( keyboard_check( ord('D') ) ) {

x+= cos( (90 + CamDirZ) * pi/180 )*Speed;

y+= sin( (90 + CamDirZ) * pi/180 )*Speed;

}

Kod jest z mojej gry, CamDirZ to kąt fi na tym rysunku> http://pl.wikipedia.org/wiki/K%C4%85ty_Eulera Kąt yaw

Odnośnik do komentarza
Udostępnij na innych stronach

if ( keyboard_check( ord('W') ) )

{

x+= cos( direction * pi/180 )*2;

y+= sin( direction * pi/180 )*2;

}

 

Hmm... nie wiem czy to ma tak wyglądać , ale

-fajnie bo ide i się normalnie zatrzymuję :) +

 

-ide w jednym kierunku , a nie przed siebie ;/ -

 

Pewnie to ja coś sknociłem ; )

Odnośnik do komentarza
Udostępnij na innych stronach

[Create]

GML
d3d_start();

d3d_set_hidden(true);

d3d_set_lighting(false);

d3d_set_culling(false);

texture_set_interpolation(true);

draw_set_color(c_white);

d3d_set_perspective(true);

zdirection = 0;

 

 

gun = d3d_model_create();

d3d_model_block(gun,0,-1,1, 7,1,0,0.3,0.3);

 

 

 

 

 

 

[steps]

 

GML
direction-=(display_mouse_get_x()-display_get_width()/2)/8;

zdirection-=(display_mouse_get_y()-display_get_height()/2)/8;

display_mouse_set(display_get_width()/2,display_get_height()/2);

 

 

{if zdirection > 89 then zdirection = 89;}

{if zdirection < -89 then zdirection = -89;}

 

 

 

 

[draw]

 

GML
d3d_set_projection(x,y,13, x+cos(direction*pi/180),y-sin(direction*pi/180),13+tan(degtorad(zdirection)), 0,0,1);

 

 

d3d_transform_set_identity();

d3d_transform_add_rotation_y(zdirection);

d3d_transform_add_rotation_z(direction);

d3d_transform_add_translation(x+0.05,y+0.05,13+0.05);

d3d_model_draw(gun,0,1.2,-2,background_get_texture(tex_gun));

d3d_transform_set_identity();

 

chyba zaraz to zleje i wracam do 2d xd

Odnośnik do komentarza
Udostępnij na innych stronach

możnaby rzutować punkt (raczej wektor od near do far plane) screena przez macierz projekcji, po czym sprawdzać, co koliduje z tym rayem i który jest najbliżej (wartość najbliżej near plane)

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