Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Poruszanie się samochodu we właściwą stronę

Ostatnio zmodyfikowano 2010-10-17 10:12
Autor Wiadomość
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:
C/C++
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; //pozycja
double dx = 0, dy = 0; //przesunięcie
int kierunek = 0;
double v = 0; //szybkość
laduj_sin_cos();

//pozycje samochodu wyświetlam zmiennymi x oraz y a obrót bodajże wokół osi x zmienną kierunek;

//...

if( ruch->Key( DIK_LEFT ) ) //strzałka w lewo
{
    kierunek -= 1;
}
if( ruch->Key( DIK_RIGHT ) ) //strzałka w prawo
{
    kierunek += 1;
}
if( ruch->Key( DIK_UP ) ) //strzałka do góry
{
    v += 0.001;
}
if( ruch->Key( DIK_DOWN ) ) //strzałka na dół
{
    v -= 0.001;
}
if( ruch->Key( DIK_SPACE ) ) //spacja :)
{
    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?
P-22893
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:
C/C++
float kierunek;
A potem, możesz rzutować sobie na int'a:
C/C++
( int ) kierunek
//lub
int( kierunek )

P-22897
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 :/
P-22898
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:
C/C++
pxR / 50 * 314 / 360 //pxr= kąt w stopniach(u mnie wszystko działa poprawnie)
//czyli u ciebie by to tak wyglądało:
D3DXMatrixRotationY( & MRotationY, int( kierunek ) * 5 / 50 * 314 / 360 );
Albo poprostu znajdź sobie w dokumentacij funkcje zamieniającą na radianty.
P-22899
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:
C/C++
kierunek / 11.7

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
P-22900
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.
P-22911
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 :)
P-22912
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:
C/C++
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? 
P-22914
« 1 » 2
  Strona 1 z 2 Następna strona