PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [SDL] movement



Woolf
19-08-2003, 18:35
hi leuz, ich mach gerdae nen space shooter und hab ein problem mit der bewegung

hier mal der code (leider ein beschissener stil...):
(wichtig sind die zeilen die c_FrameInterval enthalten, der rest ist total uninteressand...)

float CurSpeed = kSpeed; //current speed forward
float CurStrafe = kStrafe; //current speed sidewards
float CurUp = kUp; //current speed upwards

c_FrameInterval = lastmillis/1000.0f;

Uint8 *keyState = SDL_GetKeyState(NULL);

float BrakeX = 6.0f * 0.4f; // difference between BRAKING
float Brake = 1.0f; // and slowy being stopped by friction or woteva

// Check if we hit the Up arrow or the 'w' key
if(keyState[SDLK_UP] || keyState[SDLK_w] ) {

if(kSpeed < 0)
Brake = BrakeX;
else
Brake = 1.0f;
kSpeed += (0.4f * Brake) * c_FrameInterval; // raise speed, but watch the framerate
}

// Check if we hit the Down arrow or the 's' key
if(keyState[SDLK_DOWN] || keyState[SDLK_s] ) {

// Move our camera backward by a negative SPEED
//MoveCamera(-speed);
if(kSpeed > 0)
Brake = BrakeX;
else
Brake = 1.0f;
kSpeed -= (0.4f * Brake) * c_FrameInterval;
}

// Check if we hit the Left arrow or the 'a' key
if(keyState[SDLK_LEFT] || keyState[SDLK_a]) {

// Strafe the camera left
//StrafeCamera(-strafespeed);
if(kStrafe > 0)
Brake = BrakeX;
else
Brake = 1.0f;
kStrafe -= (0.2f * (Brake / 2.0f)) * c_FrameInterval;

}
// Check if we hit the Right arrow or the 'd' key
if(keyState[SDLK_RIGHT] || keyState[SDLK_d]) {

// Strafe the camera right
//StrafeCamera(strafespeed);
if(kStrafe < 0)
Brake = BrakeX;
else
Brake = 1.0f;
kStrafe += (0.2f * (Brake / 2.0f)) * c_FrameInterval;
}

if(keyState[SDLK_r]) {

// Strafe the camera left
//StrafeCamera(-strafespeed);
if(kUp < 0)
Brake = BrakeX;
else
Brake = 1.0f;
kUp += (0.2f * (Brake / 2.0f)) * c_FrameInterval;

}
// Check if we hit the Right arrow or the 'd' key
if(keyState[SDLK_f]) {

// Strafe the camera right
//StrafeCamera(strafespeed);
if(kUp > 0)
Brake = BrakeX;
else
Brake = 1.0f;
kUp -= (0.2f * (Brake / 2.0f)) * c_FrameInterval;
}

c_FrameInterval *= 100.0f;
kStrafe = min(0.3f * c_FrameInterval, max(-0.3f * c_FrameInterval, kStrafe));
kSpeed = min(1.0f * c_FrameInterval, max(-0.5f * c_FrameInterval, kSpeed));
kUp = min(0.3f * c_FrameInterval, max(-0.3f * c_FrameInterval, kUp));
c_FrameInterval /= 100.0f;

if(keyState[SDLK_q])
RollCamera(-c_FrameInterval/4.0f);
if(keyState[SDLK_e])
RollCamera(c_FrameInterval/4.0f);

Brake = 1.0f;
if(keyState[SDLK_SPACE])
Brake = 6.0f;


if(CurSpeed == kSpeed)
{
if(kSpeed < 0)
kSpeed += (0.1f * Brake) * c_FrameInterval;
else if(kSpeed > 0)
kSpeed -= (0.1f * Brake) * c_FrameInterval;
}

if(CurStrafe == kStrafe)
{
if(kStrafe < 0)
kStrafe += (0.1f * Brake) * c_FrameInterval;
if(kStrafe > 0)
kStrafe -= (0.1f * Brake) * c_FrameInterval;
}

if(CurUp == kUp)
{
if(kUp < 0)
kUp += (0.1f * Brake) * c_FrameInterval;
if(kUp > 0)
kUp -= (0.1f * Brake) * c_FrameInterval;
}


if(keyState[SDLK_SPACE] && kSpeed < 0.01f && kSpeed > -0.01f)
kSpeed = 0.0f;
if(keyState[SDLK_SPACE] && kStrafe < 0.01f && kStrafe > -0.01f)
kStrafe = 0.0f;
if(keyState[SDLK_SPACE] && kUp < 0.01f && kUp > -0.01f)
kUp = 0.0f;


vec3 force = Normalize(Direction()) * kSpeed;// * c_FrameInterval;
force += Normalize(m_vStrafe) * kStrafe;// * c_FrameInterval;
force += Normalize(m_vUpVector) * kUp;// * c_FrameInterval;

m_vPosition += force;
m_vView += force;

if( (force.length() > 0.0f) || (snd) )
SendPState();//Send state to server

das problem is, ich beschleunige wenn ich über ... ca 150+ ... frames habe, schneller als die anderen, aber rolle :
RollCamera(-c_FrameInterval/4.0f);
gleichschnell

genauso ist es wenn ich OHNE ALLEM einfach nur den speed um c_FrameInterval erhöhe

frage: wieso is das so, oder wie begrenze ich die framerate auf zb maximal 80 fps?

bischi
19-08-2003, 19:01
Framerate auf höchstens 50 Fps begrenzen!!!

http://www.mrunix.de/forums/showthread.php?threadid=32590&highlight=animation

Wir haben das hier schon mal behandelt,

MfG Bischi

Woolf
19-08-2003, 19:56
:D
jetz muss ich nur noch hinbekommen dass die verschiedenen clients nicht nur richtig positioniert, sondern auch richtig gedreht sind ...

neues problem:

ich führe LOOK aus mit der camera
(macht einen gluLookAt befehl)
dann translatef für die clientposition, dann LOOKNULL mit dem client->, macht auch gluLookAt, nur is die position 0, damit es gedreht wird und nicht bewegt

gut, für nen egoshooter
aber es is ein spaceshooter, und der 2. look befehl wird immer mit demselben upvector ausgeführt...
wieso?

ich hab mir den upvector ausgeben lassen und er stimmt, doch die glulookat nimmt die zahl einfach nicht???

sonst ist alles so wies sein soll... nur die rotation stimmt nicht...

wenn ich die richtung (vektor) und den upvector habe, wie dreh ich das dann richtig?
für glRotatef brauch ich "grade" ..glRotatef(rotation(in graden), X, Y, Z)
und gluLookAt macht nicht was es soll...

das mit dem gluLookAt und position null sollte doch stimmen? sonst würde der hintergrund ja nicht richtig "rotieren"
---------------------
wieso heißt mein thread auf einmal [SDL] movement???
wieso SDL? wenns doch um opengel geht... sdl hat nichts mit dem problem zu tun...
naja egal ;)