En rédigeant le post, j'ai abouti à 3 méthodes:
Méthode évènementielle
Supreme Commander me semble stocker les évènements pour pouvoir afficher les "replay". Cela aboutit parfois à des désynchronisations si tu changes un paramètre global du jeu. par exemple, si tu stockes l'évènement "accélération vers la droite ON à la date T", si l'accélération est une valeur globale, la modifier changera le replay. Cela n'arrive pas si tu stockes la valeur d'accélération aussi: "évènement: accélération; direction: droite; valeur: 10; date: T".
Ensuite, il faut parcourir cette table sous la forme:
En cas d'aléatoire, il faudra en stocker la valeur.
Si tu n'as que la trajectoire du joueur, et que celle-ci ne doit pas tenir compte du décor, alors tu peux stocker les débuts/fin d'accélération. Cela te permettra de calculer la vitesse du personnage et donc, sa position.
Problème: chaos
Toutefois, un tel mécanisme est sujet au chaos. Une erreur d'arrondis qui se promène, et la trajectoire peut changer totalement!
Tu peux alors stocker des positions à intervalles réguliers, avec les valeurs d'accélération, de vitesse et de position du personnage. Ces "points-clefs" permettront de resynchroniser le replay.
Méthode Keyframes
Si tu préfères ne stocker que des points-clefs, genre keyframe (comme les animations finalement), alors tu peux enregistrer la vitesse et la position du personnage à intervalle régulier. Ensuite, tu peux tracer une courbe de Bézier cubique qui passe par les points enregistrés à T et à T', et donc la dérivée en T est la vitesse à la date T, et idem pour T'.
La méthode des keyframes te garantit que le replay ne dégénèrera pas avec sa durée: peu importe la durée du replay, les keyframes passeront toujours aux endroits où le joueur est passé.
Problème: frames manquantes
Si l'intervalle de temps entre deux keyframes est trop grand, alors le replay pourra sauter des mouvements que le joueur avait fait (exemple: le système enregistre une keyframe, le joueur descend et remonte une échelle, le système enregistre la keyframe suivante: le replay ne montre pas la descente de l'échelle).
Méthode mixte
Enfin, tu peux faire un mix des deux: utiliser des keyframes, mais les enregistrer que lorsqu'un évènement survient (changement de vitesse du joueur / accélération modifiée).
C'est, je pense, la meilleure méthode car elle évite la dégénérescence (grâce aux keyframes), sans pour autant sauter des actions (car toute action, aka évènement, entraine l'enregistrement d'une keyframe).
- Evènementielle (comme proposée): pas terrible pour de longues durées, mais peu d'ajout de code
- Keyframes: attrayante, mais lourde en mémoire si on ne veut pas "rater" des actions
- Mixte: ma préférée
Méthode évènementielle
Supreme Commander me semble stocker les évènements pour pouvoir afficher les "replay". Cela aboutit parfois à des désynchronisations si tu changes un paramètre global du jeu. par exemple, si tu stockes l'évènement "accélération vers la droite ON à la date T", si l'accélération est une valeur globale, la modifier changera le replay. Cela n'arrive pas si tu stockes la valeur d'accélération aussi: "évènement: accélération; direction: droite; valeur: 10; date: T".
Ensuite, il faut parcourir cette table sous la forme:
Code :
Pour chaque ligne
>> Attendre la durée T
>> Lancer l'évènement indiqué avec ses paramètres
Passer à la ligne suivante
En cas d'aléatoire, il faudra en stocker la valeur.
Si tu n'as que la trajectoire du joueur, et que celle-ci ne doit pas tenir compte du décor, alors tu peux stocker les débuts/fin d'accélération. Cela te permettra de calculer la vitesse du personnage et donc, sa position.
Problème: chaos
Toutefois, un tel mécanisme est sujet au chaos. Une erreur d'arrondis qui se promène, et la trajectoire peut changer totalement!
Tu peux alors stocker des positions à intervalles réguliers, avec les valeurs d'accélération, de vitesse et de position du personnage. Ces "points-clefs" permettront de resynchroniser le replay.
Méthode Keyframes
Si tu préfères ne stocker que des points-clefs, genre keyframe (comme les animations finalement), alors tu peux enregistrer la vitesse et la position du personnage à intervalle régulier. Ensuite, tu peux tracer une courbe de Bézier cubique qui passe par les points enregistrés à T et à T', et donc la dérivée en T est la vitesse à la date T, et idem pour T'.
La méthode des keyframes te garantit que le replay ne dégénèrera pas avec sa durée: peu importe la durée du replay, les keyframes passeront toujours aux endroits où le joueur est passé.
Problème: frames manquantes
Si l'intervalle de temps entre deux keyframes est trop grand, alors le replay pourra sauter des mouvements que le joueur avait fait (exemple: le système enregistre une keyframe, le joueur descend et remonte une échelle, le système enregistre la keyframe suivante: le replay ne montre pas la descente de l'échelle).
Méthode mixte
Enfin, tu peux faire un mix des deux: utiliser des keyframes, mais les enregistrer que lorsqu'un évènement survient (changement de vitesse du joueur / accélération modifiée).
C'est, je pense, la meilleure méthode car elle évite la dégénérescence (grâce aux keyframes), sans pour autant sauter des actions (car toute action, aka évènement, entraine l'enregistrement d'une keyframe).