Einheitliches Bewegen



  • Hallo liebe Com,

    Ich Programmiere derzeit spaßenshalber an einer Engine..
    Nur ich habe das Problem, dass auf jedem PC das "Spiel" verschieden schnell läuft..( schnellerer Prozessor = schnellere Bewegung ) ..
    da habe ich den code ..:
    // Nach Vorn Bewegen
    if( bKeys[VK_W] ){
    fTransZ -= cos(fRotateY * fPi180) / 200 * fRunSpeed;
    fTransX -= sin(fRotateY * fPi180 ) / 200* fRunSpeed;
    }
    // Nach Hinten Bewegen
    if( bKeys[VK_S] ){
    fTransZ += cos(fRotateY * fPi180) / 200* fRunSpeed;
    fTransX += sin(fRotateY * fPi180) / 200* fRunSpeed;
    }
    // Nach Rechts Bewegen
    if( bKeys[VK_D] ){
    fTransX += cos(fRotateY * fPi180) / 200* fRunSpeed;
    fTransZ -= sin(fRotateY * fPi180) / 200* fRunSpeed;
    }
    // Nach Links Bewegen
    if( bKeys[VK_A] ){
    fTransX -= cos(fRotateY * fPi180) / 200* fRunSpeed;
    fTransZ += sin(fRotateY * fPi180) / 200* fRunSpeed;
    }
    // steht wo anders verwendet aber variablen..
    glTranslatef( -fTransX, fTransY, -fTransZ );

    Meine Frage nun: Wie bekomme ich es hin, bei jedem PC gleich schnell zu gehn .. ?
    Eine überlegung wäre, es mit time zu machen .. aber wie?



  • Sowas in der Art:

    void move(){
    	static unsigned int timeold = GetTickCount();
    	unsigned int timenow = GetTickCount();
    	unsigned int timepassed = timeold - timenow;
    	if (!timepassed) //keine Zeit vergangen -> keine Bewegung passiert
    		return;
    	timeold = timenow;
    	...
    
    	// Nach Vorn Bewegen
    	if (bKeys[VK_W]){
    		fTransZ -= cos(fRotateY * fPi180) / 200 * fRunSpeed * timepassed; //je mehr Zeit vergangen ist, desto mehr Bewegung ist passiert
    		fTransX -= sin(fRotateY * fPi180) / 200 * fRunSpeed * timepassed;
    	}
    	...
    }
    

    GetTickCount ist eine Windows-Funktion, wenn du was anderes benutzt musst du die durch eine entsprechende Funktion ersetzen, die dir die Zeit in Millisekunden gibt.



  • GetTickCount() hat nur eine Auflösung von vs. 15ms, was unter Umständen viel zu wenig ist, um verlässlich die seit dem letzten Update vergangene Zeit zu messen. Besser einfach die absolute Zeit nehmen oder eine genauere Methode (z.B. QueryPerformanceCounter())...



  • danke 🙂


Anmelden zum Antworten