Je travaille sur un jeu de course automobile et je viens de mettre en place un sprite fantôme pour rejouer les courses passées. J'utilise un moteur physique et après de nombreuses lectures, je suis arrivé à la conclusion que la meilleure façon de stocker les données fantômes pour la relecture serait d'enregistrer la position et la rotation de la voiture à des moments donnés, comme par exemple décrit ici: https: // gamedev. stackexchange.com/a/8380/26261 .
Mais quel serait un bon moyen de trouver ces points temporels lors de la relecture? Un exemple serait un enregistrement avec ces données:
time: +3.19932 (seconds since race start)
position: 180,40 (position at that time)
rotation: 30.4 (rotation at that time)
Mais j'ai plusieurs problèmes avec ça:
Lorsque je rejoue, il est peu probable que j'atteigne à nouveau le point de temps exact à 3.19932 - plus probablement, j'aurai un point de temps autour de 3.1 et je devrai trouver l'enregistrement correspondant le plus proche. Lors de l'interpolation, même la correspondance la plus proche au-dessus et en dessous. Cela semble très inefficace et prend du temps?
Dans quelle structure de liste puis-je stocker ces enregistrements pour une relecture ultérieure? Un tableau? Cela ne signifie-t-il pas que le temps de recherche des enregistrements correspondant à un certain temps augmentera plus la course est longue?
Quelle fréquence dois-je utiliser pour les points temporels? Chaque trame serait -Je suppose- exagérée, je devrais plutôt enregistrer chaque nième trame et interpoler entre les deux, ce qui rend les questions de stockage en 2. encore plus difficiles.
Cette idée est-elle même la bonne approche? Si oui, comment pourrais-je stocker et récupérer efficacement les données? Veuillez noter que j'aimerais généralement utiliser la structure de données ci-dessus, pas les gamestates déterministes et l'enregistrement des entrées utilisateur, etc.
Merci pour toute aide!
EDIT: Je me rends compte que je devrais décrire l'environnement que j'utilise: Cocos2D pour iPhone. Il y a une méthode update:(ccTime)delta
. Idéalement, cette méthode serait appelée toutes les 1/60 secondes, mais il n'y a aucune garantie - delta
c'est le temps réel écoulé depuis le dernier gametick et pourrait être beaucoup plus ou moins que 1/60. C'est dans cette méthode que je voudrais stocker le gamestate actuel.