Estoy trabajando en un juego de carreras de autos y acabo de implementar un sprite fantasma para reproducir carreras pasadas. Utilizo un motor de física y después de mucha lectura llegué a la conclusión de que la mejor manera de almacenar los datos fantasma para reproducirlos sería registrar la posición y rotación del automóvil en puntos de tiempo determinados, como por ejemplo se describe aquí: https: // gamedev. stackexchange.com/a/8380/26261 .
Pero, ¿cuál sería una buena manera de encontrar esos puntos de tiempo durante la repetición? Un ejemplo sería un registro con estos datos:
time: +3.19932 (seconds since race start)
position: 180,40 (position at that time)
rotation: 30.4 (rotation at that time)
Pero tengo varios problemas con eso:
Cuando reproduzco, es poco probable que alcance el punto de tiempo exacto en 3.19932 nuevamente; lo más probable es que tenga un punto de tiempo alrededor de 3.1 y tenga que encontrar el registro de coincidencia más cercano. Al interpolar, incluso la coincidencia más cercana arriba y abajo. Esto suena muy ineficiente y consume mucho tiempo?
¿En qué estructura de lista podría almacenar estos registros para una reproducción posterior? ¿Una matriz? ¿No significa eso que el tiempo de búsqueda de registros que coincidan con un cierto tiempo aumentará cuanto más larga sea la carrera?
¿Qué frecuencia debo usar para los puntos de tiempo? Cada cuadro sería, supongo, excesivo, más bien debería guardar, es decir, cada enésimo cuadro e interpolar entre ellos, lo que hace que las preguntas de almacenamiento en 2. sean aún más difíciles.
Entonces, ¿es esta idea incluso el enfoque correcto? En caso afirmativo, ¿cómo podría almacenar y recuperar los datos de manera eficiente? Tenga en cuenta que, en general, me gustaría usar la estructura de datos anterior, no estados de juego deterministas y registrar la entrada del usuario, etc.
¡Gracias por cualquier ayuda!
EDITAR: Me doy cuenta de que debería describir el entorno que uso: Cocos2D para iPhone. Hay un método update:(ccTime)delta
. Idealmente, este método se llamaría cada 1/60 segundos, pero no hay garantía: delta
es el tiempo real transcurrido desde el último gametick y podría ser mucho más o menos de 1/60. Es en este método donde me gustaría almacenar el estado del juego actual.