SeaMonster131 Temat założony przez niniejszego użytkownika |
[C++] Poruszanie się samochodu we właściwą stronę » 2010-10-16 19:44:31 Witam, chciałbym aby samochód poruszał się we właściwą strone. Jak naciskam jakiś tam klawisz to samochód jedzie do przodu, do tyłu lecz nie do końca we właściwą strone :) Jak coś to to pisze w Direct3D, ale różnicy nie ma :) Kod: double tab_sin[ 72 ]; double tab_cos[ 72 ];
void laduj_sin_cos() { for( int i = 0; i < 72; i++ ) { tab_sin[ i ] = sin(( M_PI *( i * 5 ) ) / 180 ); tab_cos[ i ] = cos(( M_PI *( i * 5 ) ) / 180 ); } }
int x = 0, y = 0; double dx = 0, dy = 0; int kierunek = 0; double v = 0; laduj_sin_cos();
if( ruch->Key( DIK_LEFT ) ) { kierunek -= 1; } if( ruch->Key( DIK_RIGHT ) ) { kierunek += 1; } if( ruch->Key( DIK_UP ) ) { v += 0.001; } if( ruch->Key( DIK_DOWN ) ) { v -= 0.001; } if( ruch->Key( DIK_SPACE ) ) { v = 0; }
dx += v * tab_cos[ kierunek ]; dy += v * tab_sin[ kierunek ];
if( dx >= 1 || dx <= - 1 ) { x += int( dx ); dx = dx - int( dx ); } if( dy >= 1 || dy <= - 1 ) { y += int( dy ); dy = dy - int( dy ); }
Jak widać kod jest zaczerpnięty od EasyKoder'a :) Nie wiem co tutaj "szwankuje" więc proszę Was o pomoc ;) Aha, i czy da sie jakoś wykombinować aby zmienna kierunek mogłaby być typu float? |
|
szyx_yankez |
» 2010-10-16 20:09:22 Aha, i czy da sie jakoś wykombinować aby zmienna kierunek mogłaby być typu float? |
No jasne:
A potem, możesz rzutować sobie na int'a:
( int ) kierunek
int( kierunek )
|
|
SeaMonster131 Temat założony przez niniejszego użytkownika |
» 2010-10-16 20:17:24 Dzięki :) Tylko niestety jeszcze ten samochód (a tak właściwie to ciężarówka :P) nie jedzie we właściwą strone :/ |
|
szyx_yankez |
» 2010-10-16 20:28:20 A co do pierwszego problemu:
Pewnie biega oto, że ty podczas "translacij" macierzy obrotu na osi Y, podajesz kąt, w którym pełny obrót wynosi 72*, A w directx jest to bodajże 4(dokładnie nie pamiętam, w każdym razie jest to mała liczba).
U mnie w silniku, przelicznik z Directxoskiego pełnego obrotu na 360*, wygląda tak:
pxR / 50 * 314 / 360
D3DXMatrixRotationY( & MRotationY, int( kierunek ) * 5 / 50 * 314 / 360 ); Albo poprostu znajdź sobie w dokumentacij funkcje zamieniającą na radianty. |
|
SeaMonster131 Temat założony przez niniejszego użytkownika |
» 2010-10-16 21:50:12 okej, dzięki, zaraz to wypróbuje :) #edit: nie działa :/ ALE jeśli dam: To jeździ już normalnie :) Nie wiem czemu wychodzi że przez 11.7 musze dzielić, mm..ważne że działa :D Tylko że gorzej jeżeli kierunek < 0 albo kierunek >= 70.... Wtedy już nie działa poprawnie albo nawet wcale nie działa (musze dać jakiegoś if'a ale takiego który by nie utrudniał jazdy...) :D I jest okej, if(kierunek > 74) kierunek = 0; I odwrotnie. Wszystko gra :) Dzięki |
|
VND |
» 2010-10-17 01:16:57 Twoje tablice z kątami tab_sin i tab_cos mają po 72 elementy, więc kierunek nie może być większy.
|
|
SeaMonster131 Temat założony przez niniejszego użytkownika |
» 2010-10-17 01:56:54 Heh, musze sie jeszcze douczyć tych sinusów i cosinusów (nie wiem czy dobrze napisałem bo nie wiem jak to sie odmienia) :) A z tą tablicą to faktycznie, ale i tak jest to niezauważalna różnica, ale dzięki, poprawie :) |
|
szyx_yankez |
» 2010-10-17 07:59:29 Tobie kierunek skacze co 5* więc nie za bardzo to wygląda(pewnie widać jak szarpie).
Aby było 360* trzeba zmodyfikować tak:
double tab_sin[ 360 ]; double tab_cos[ 360 ];
void laduj_sin_cos() { for( int i = 0; i < 360; i++ ) { tab_sin[ i ] = sin(( M_PI *( i ) ) / 180 ); tab_cos[ i ] = cos(( M_PI *( i ) ) / 180 ); } }
Jednak nie będzie strzelanki?
|
|
« 1 » 2 |