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.
Respuestas:
No :)
Supongamos que lo almacena como una matriz (tenga en cuenta que las instantáneas están en orden cronológico, pero no espaciadas uniformemente):
Luego, cuando comienza la repetición / juego, obtienes el primer y segundo elemento de la matriz:
Luego, en cada cuadro (
currentTime
es la hora actual en este nuevo juego):Por supuesto, esto podría optimizarse almacenando en caché algunos de los cálculos. No hay búsqueda a través de la matriz, solo busca índices específicos.
fuente
No es muy dificil. Puede almacenar sus datos en puntos arbitrarios en el tiempo (cuanto más, mejor), y puede interpolar los valores de los datos en función de la marca de tiempo que está buscando y los datos de las dos marcas de tiempo registradas más cercanas, por ejemplo:
Ahora imagine que desea obtener la posición y la rotación en el momento 0.10. Como 0,10 se encuentra entre los puntos '1' (que significa 0,05 veces) y '2' (que significa 0,15 veces), debe interpolarlos.
Lerp
es solo interpolación lineal .Así que vamos a llenar los vacíos con algunos ejemplos (*).
HTH
fuente