«Time Control» dans un Platformer 2D


9

Je fais un jeu de plateforme 2d où le joueur peut appuyer sur un bouton et redémarrer le niveau, seul leur personnage précédent exécutera également le niveau en même temps, comme s'il voyageait dans le temps.

Je sais que d'autres jeux l'ont déjà fait auparavant, et la façon dont j'ai pensé le faire est de faire en sorte que le personnage du jeu ait un ensemble d'actions (ralenti, sauter, marcher à gauche, etc.), puis détecter les changements dans ces actions et les connecter à une liste avec le temps de jeu. Ainsi, lorsque j'ai besoin que le personnage exécute à nouveau le niveau de lui-même, je peux simplement parcourir la liste en modifiant ses actions au bon moment.

Est-ce la meilleure façon de le faire? Quelqu'un at-il une expérience dans ce domaine?

Merci.


Ce que vous recherchez est plus une «relecture» qu'un contrôle du temps. Vous trouverez peut-être de bons articles sur les moyens de traiter cela, mais je dis toujours que la réponse ci-dessous est également un bon début dans ce domaine. Gardez à l'esprit que les choses «aléatoires» dans le jeu gâcheront les rediffusions pour le personnage «fantôme» qui l'exécutent à nouveau si elles peuvent affecter la progression.
James

3
Bon point sur les parties "aléatoires". Assurez-vous d'utiliser un générateur aléatoire qui génère ses nombres en fonction d'une graine. Enregistrez ensuite la graine avec votre replay et utilisez la même graine lors de la lecture de cette replay.
bummzack

Comment avez-vous fait cela? Quelle est votre solution?

Réponses:


8

ÉDITER:

Veuillez voir la réponse de @ Bluescrn à cette question; il développe les faiblesses dans la relecture des commandes plutôt que les vecteurs de mouvement ou la position.

-

Vous êtes sur la bonne voie. Voici l'approche que j'utiliserais:

Contrôleurs

Créez une classe Controller qui reçoit les entrées du clavier et les transmet à votre personnage. Cependant, ayez également un enregistrement de contrôleur exactement quand les touches significatives (par exemple flèches, saut, etc.) ont été enfoncées et quand elles ont été relâchées. Il stockerait ce type d'informations:

actions[0].milliseconds = 400     actions[0].action = right pressed
actions[1].milliseconds = 1000    actions[1].action = jump pressed
actions[2].milliseconds = 1300    actions[2].action = jump released
actions[3].milliseconds = 2500    actions[3].action = jump pressed
actions[4].milliseconds = 3000    actions[4].action = jump released
actions[5].milliseconds = 5330    actions[5].action = right released

Un contrôleur a deux modes:

  1. Enregistrement: Reçoit une entrée au clavier. Enregistre l'entrée dans la liste. Remet l'entrée de caractères en fonction de l'état du clavier.
  2. Rejouer: ignore la saisie au clavier. Les progrès dans la liste en millisecondes se sont écoulés depuis le début du niveau. Remet l'entrée de caractères basée sur l'état du clavier enregistré au moment actuel.

Personnages

Lorsque votre objet Personnage est construit, il crée un nouveau contrôleur pour lui-même. Le personnage peut être dans l'un des deux modes à tout moment:

  1. Actif: Il n'y a qu'un seul personnage actif et c'est celui que vous contrôlez. Lorsque le personnage est en mode actif, son contrôleur est en mode enregistrement. Par défaut, lorsqu'un personnage est construit, il est en mode actif.
  2. Ghost: c'est celui qui rejoue vos actions passées. Lorsqu'un personnage passe en mode fantôme, il change son apparence et règle son contrôleur en mode relecture.

Niveaux

Un niveau fraîchement commencé

Lorsque vous démarrez le niveau, créez un seul personnage. Maintenant, le niveau commence et le joueur fait son truc.

Quand le temps revient

Lorsque le niveau est réinitialisé, faites trois choses:

  1. Dites au personnage actif actuel d'entrer en mode fantôme.
  2. Créez un nouveau personnage.
  3. Appelez tous les personnages pour se réinitialiser. Cela les remettra à la position de départ sans mouvement, etc.

Ensuite, le niveau commence et le joueur fait son truc.


C'est parfaitement clair. Merci beaucoup. J'avais en quelque sorte la bonne idée, mais j'allais créer un système central pour enregistrer les mouvements, mais avoir chaque personnage enregistrant son propre mouvement est un moyen beaucoup plus facile de s'y prendre. Merci.
Woody Zantzinger

8

Si vous relisez des entrées enregistrées, tenez compte des implications de tout objet en mouvement / destructible / interactif dans le monde, qui peut avoir bougé ou changé d'état lors de la relecture des actions

De plus, la relecture des entrées ne fonctionnera pas précisément si votre jeu utilise un pas de temps variable. Vous voudrez peut-être envisager une mise à jour du jeu à pas de temps fixe (avec interpolation pour le rendu à fréquence d'images variable)?


1
+10 si je pouvais. De grandes considérations. La relecture des vecteurs de mouvement ou de la position serait supérieure à la relecture de l'entrée, selon l'effet souhaité. Des dizaines de millisecondes d'imprécision entre les images sont probablement plus faciles à prendre en compte lorsque vous travaillez avec le mouvement et la position qu'avec l'entrée.
doppelgreener


0

L'enregistrement de l'entrée clavier peut ne pas être très utile dans votre cas. Vous pouvez cependant générer une spline avec une chronologie. Vous pouvez même rembobiner le temps si vous êtes délicat avec les forces que vous devez appliquer

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.