La respuesta simple es no, no desea utilizar la devolución de llamada glutIdleFunc en un juego que tiene algún tipo de simulación. La razón de esto es que esta función divorcia la animación y dibuja el código del manejo de eventos de la ventana, pero no de forma asincrónica. En otras palabras, recibir y entregar código de sorteo de eventos de ventana (o lo que sea que coloque en esta devolución de llamada), esto está perfectamente bien para una aplicación interactiva (interactuar, luego responder), pero no para un juego donde la física o el estado del juego deben progresar independiente de la interacción o el tiempo de procesamiento.
Desea desacoplar completamente el manejo de entrada, el estado del juego y el código de sorteo. Hay una solución fácil y limpia para esto que no involucra la biblioteca de gráficos directamente (es decir, es portátil y fácil de visualizar); desea que todo el ciclo del juego produzca tiempo y que la simulación consuma el tiempo producido (en fragmentos). Sin embargo, la clave es integrar la cantidad de tiempo que su simulación consumió en su animación.
La mejor explicación y tutorial que he encontrado sobre esto es Fix Your Timestep de Glenn Fiedler
Este tutorial tiene el para tratamiento completo, sin embargo, si usted no tiene una verdadera simulación de la física, puede omitir la verdadera integración, sino el bucle básico todavía se reduce a (detallado en pseudo-código):
// The amount of time we want to simulate each step, in milliseconds
// (written as implicit frame-rate)
timeDelta = 1000/30
timeAccumulator = 0
while ( game should run )
{
timeSimulatedThisIteration = 0
startTime = currentTime()
while ( timeAccumulator >= timeDelta )
{
stepGameState( timeDelta )
timeAccumulator -= timeDelta
timeSimulatedThisIteration += timeDelta
}
stepAnimation( timeSimulatedThisIteration )
renderFrame() // OpenGL frame drawing code goes here
handleUserInput()
timeAccumulator += currentTime() - startTime
}
Al hacerlo de esta manera, los bloqueos en su código de procesamiento, manejo de entrada o sistema operativo no hacen que su estado de juego se quede atrás. Este método también es portátil e independiente de la biblioteca de gráficos.
GLUT es una buena biblioteca, sin embargo, está estrictamente basada en eventos. Usted registra devoluciones de llamada y dispara el bucle principal. Siempre entrega el control de su bucle principal usando GLUT. Hay trucos para evitarlo , también puede simular un bucle externo utilizando temporizadores y demás, pero otra biblioteca es probablemente una mejor manera (más fácil) de hacerlo. Hay muchas alternativas, aquí hay algunas (algunas con buena documentación y tutoriales rápidos):
- GLFW que le brinda la capacidad de obtener eventos de entrada en línea (en su propio bucle principal).
- SDL , sin embargo, su énfasis no es específicamente OpenGL.