Anzeige:
Ergebnis 1 bis 3 von 3

Thema: [SDL] movement

  1. #1
    Registrierter Benutzer
    Registriert seit
    21.10.2002
    Beiträge
    53

    movement

    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...)
    Code:
    	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?
    Slackware 8.1
    C/C++ OpenGL lover
    Java2 learner

  2. #2
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Framerate auf höchstens 50 Fps begrenzen!!!

    http://www.mrunix.de/forums/showthre...ight=animation

    Wir haben das hier schon mal behandelt,

    MfG Bischi

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  3. #3
    Registrierter Benutzer
    Registriert seit
    21.10.2002
    Beiträge
    53

    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
    Geändert von Woolf (19-08-2003 um 20:55 Uhr)
    Slackware 8.1
    C/C++ OpenGL lover
    Java2 learner

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •