2010-02-04 21 views
5

Entiendo por qué lo hace, pero realmente no tengo ni idea de cómo evitarlo. Entonces, el escenario es que, en cada fotograma, muevo el automóvil por una cierta cantidad de píxeles predefinidos. Lo que pasa es que cuando uso una computadora lenta o más rápida ... bueno, obtengo menos o más cuadros por segundo para que el automóvil se mueva más lento o más rápido. Me preguntaba cómo podría evitar eso.Juego de carreras de coches, el coche se mueve más rápido en una computadora más rápida

Sospecho que tendré el mismo problema al usar cualquier biblioteca ... Esta es la primera vez que hago cosas en tiempo real como esa.

+8

¡Presione el botón Turbo! –

+0

Posible engaño de http://stackoverflow.com/questions/622604/best-approach-for-game-animation – Macke

Respuesta

12

que sospecha que su código actual se parece de alguna manera como este

// to be called every frame 
void OnEveryFrame() 
{ 
    MoveCar(); 
    DrawCarToScreen(); 
} 

pero debe ser así:

// to be called - for example - 50 times per second: 
void OnEveryTimerEvent() 
{ 
    MoveCar(); 
} 

// to be called every frame 
void OnEveryFrame() 
{ 
    LockTimerEvents(); 
    DrawCarToScreen(); 
    UnlockAndProcessOutstandingTimerEvents(); 
} 

Se tienen que establecer un evento de temporizador de acuerdo, por supuesto.

10

Mueva el automóvil según los temporizadores y no la velocidad de cuadros. es decir, el modelo del automóvil debe ser independiente de la representación de la pantalla.

+0

¿El temporizador calcularía el tiempo entre cada cuadro si lo entiendo correctamente? – DogDog

+0

@Apoc, sí. Tendrás un juego mucho más consistente si vas basado en el tiempo en lugar del framerate – Polaris878

0

Debe guardar el tiempo antes de mover el automóvil y los dibujos.
Ahorre el tiempo después de todos los cálculos.
Mueva su automóvil por Npixels/segundo

2

El movimiento debe estar limitado por un retraso "real", es decir, su automóvil se moverá a la velocidad de x pixel por segmento de tiempo.

2

Lea el reloj en tiempo real y mueva el automóvil una distancia adecuada durante el tiempo transcurrido. Esto puede parecer algo "desigual" si la computadora es demasiado lenta, pero hace que la velocidad del automóvil sea independiente de la velocidad de la CPU.

3

Puede resolver esto usando temporizadores precisos y cálculos vectoriales.

Así que, por el bien del argumento, le sugerimos que su código de dibujo pueda ser llamado en cualquier momento, p. Ej. 1 segundo de diferencia o 3 segundos de separación o 0.02 segundos de diferencia.

Tome la velocidad de movimiento del automóvil para que sea de 40 píxeles por segundo.

Por lo tanto, el número de píxeles que se debe mover es (TIME_NOW - LAST_FRAME_TIME) * 40px.

2

Debe limitar la velocidad de cuadros a X cuadros por segundo (60 FPS es el más común). Esta es una característica común en la mayoría de los marcos multimedia, incluido SFML. Para SFML examinaría el método Window/RenderWindow SetFramerateLimit(unsigned int Limit).

+0

Eso no soluciona el problema cuando las velocidades de fotogramas son menores a 60. – DogDog

1

Necesita fix your timestep. Básicamente, cada fotograma mueve el automóvil una distancia que varía según la cantidad de tiempo transcurrida desde la última llamada de actualización. De esta forma, obtienes la velocidad correcta independientemente de la velocidad de cuadros.

Cuestiones relacionadas