Je me demande comment les mécanismes de manipulation du temps dans les jeux sont généralement conçus. Je suis particulièrement intéressé par le retournement du temps (un peu comme dans le dernier SSX ou Prince of Persia).
Le jeu est un jeu de tir 2D de haut en bas.
Le mécanisme que j'essaye de concevoir / implémenter a les exigences suivantes:
1) Les actions d'entités en dehors du personnage du joueur sont complètement déterministes.
- L'action d'une entité est basée sur les images progressées depuis le début du niveau et / ou la position du joueur sur l'écran
- Les entités sont générées à une heure définie pendant le niveau.
2) L'inversion du temps fonctionne en inversant en arrière en temps réel.
- Les actions des joueurs sont également inversées, il rejoue à l'envers ce que le joueur a effectué. Le joueur n'a aucun contrôle pendant le temps inverse.
- Il n'y a pas de limite sur le temps passé à inverser, nous pouvons inverser jusqu'au début du niveau si vous le souhaitez.
Par exemple:
Images 0-50: le joueur avance de 20 unités pendant cette période. L'ennemi 1 apparaît à l'image 20 L'ennemi 1 se déplace de 10 unités vers la gauche pendant l'image 30-40 Le joueur tire la balle à l'image 45 La balle se déplace 5 vers l'avant (45-50) et tue l'ennemi 1 à cadre 50
Inverser cela jouerait en temps réel: le joueur recule de 20 unités pendant ce temps. L'ennemi 1 ressuscite à l'image 50 La balle réapparaît à l'image 50 La balle recule de 5 et disparaît (50-45) L'ennemi se déplace à gauche 10 (40-30) L'ennemi est retiré à cadre 20.
En regardant simplement le mouvement, j'avais quelques idées sur la façon d'y parvenir, je pensais avoir une interface qui changerait le comportement lorsque le temps avançait ou s'inversait. Au lieu de faire quelque chose comme ça:
void update()
{
movement += new Vector(0,5);
}
Je ferais quelque chose comme ça:
public interface movement()
{
public void move(Vector v, Entity e);
}
public class advance() implements movement
{
public void move(Vector v, Entity e)
{
e.location += v;
}
}
public class reverse() implements movement
{
public void move(Vector v, Entity e)
{
e.location -= v;
}
}
public void update()
{
moveLogic.move(new vector(5,0));
}
Cependant, j'ai réalisé que ce ne serait pas des performances optimales et que cela deviendrait rapidement compliqué pour des actions plus avancées (comme un mouvement fluide le long de chemins courbes, etc.).