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.
Réponses:
Nan :)
Supposons que vous le stockiez sous forme de tableau (notez que les instantanés sont dans l'ordre chronologique, mais pas régulièrement espacés):
Ensuite, lorsque la relecture / partie commence, vous obtenez le premier et le deuxième élément du tableau:
Puis dans chaque image (
currentTime
c'est l'heure actuelle dans ce nouveau jeu):Bien sûr, cela pourrait être optimisé en mettant en cache certains des calculs. Il n'y a pas de recherche dans le tableau, il suffit de rechercher des indices spécifiques.
la source
Ce n'est pas trop dur. Vous pouvez stocker vos données à des moments arbitraires (plus, mieux c'est), et vous pouvez interpoler les valeurs des données en fonction de l'horodatage que vous recherchez et des données des deux horodatages enregistrés les plus proches, par exemple:
Imaginez maintenant que vous souhaitez obtenir la position et la rotation au temps 0,10. Comme 0,10 se situe entre les points «1» (ce qui signifie 0,05 fois) et «2» (ce qui signifie 0,15 fois), vous devez les interpoler.
Lerp
est juste une interpolation linéaire .Remplissons donc les lacunes avec quelques exemples (*).
HTH.
la source