Contexte:
J'ai un problème pour obtenir la courbe de saut correcte pour un projet de remake de plateforme rétro. Le jeu original est pour la NES, et la vitesse du joueur est stockée dans deux parties distinctes: un octet pour le nombre entier et un autre pour la partie fractionnaire.
La gravité est ajoutée à la vitesse Y du joueur à un taux de 0,25 / image.
Lorsque le joueur saute, sa vitesse Y est fixée à -4,64453125. Le reste de la courbe de saut est laissé à la gravité.
Au fur et à mesure que le joueur monte, sa vitesse verticale converge vers 0 à raison de 0,25 / image. Cependant, lorsque la vitesse du joueur atteint une valeur inférieure à zéro, la vitesse change suivant un modèle différent. Au lieu de diminuer régulièrement de 0,25 à chaque image, il suit ce modèle:
[1.75, -0.25, -0.25, -0.25, 1.75, -0.25, -0.25, -0.25, 1.75, ...]
Il semble avoir quelque chose à voir avec un débordement d'entier.
Les données:
Voici un vidage des données de l'original. C'est un tableau de la vitesse.
Jump Curve
Y-Hi Y-Lo Decimal Change/Frame
4 165 4.64453125 ?
4 101 4.39453125 -0.25
4 37 4.14453125 -0.25
3 229 3.89453125 -0.25
3 165 3.64453125 -0.25
3 101 3.39453125 -0.25
3 37 3.14453125 -0.25
2 229 2.89453125 -0.25
2 165 2.64453125 -0.25
2 101 2.39453125 -0.25
2 37 2.14453125 -0.25
1 229 1.89453125 -0.25
1 165 1.64453125 -0.25
1 101 1.39453125 -0.25
1 37 1.14453125 -0.25
0 229 0.89453125 -0.25
0 165 0.64453125 -0.25
0 101 0.39453125 -0.25
0 37 0.14453125 -0.25
-1 229 -1.89453125 1.75
-1 165 -1.64453125 -0.25
-1 101 -1.39453125 -0.25
-1 37 -1.14453125 -0.25
-2 229 -2.89453125 1.75
-2 165 -2.64453125 -0.25
-2 101 -2.39453125 -0.25
-2 37 -2.14453125 -0.25
-3 229 -3.89453125 1.75
-3 165 -3.64453125 -0.25
-3 101 -3.39453125 -0.25
-3 37 -3.14453125 -0.25
-4 229 -4.89453125 1.75
-4 165 -4.64453125 -0.25
-4 101 -4.39453125 -0.25
-4 37 -4.14453125 -0.25
-5 229 -5.89453125 1.75
-5 165 -5.64453125 -0.25
-5 101 -5.39453125 -0.25
-5 37 -5.14453125 -0.25
-6 229 -6.89453125 1.75
Problème:
Dans mon jeu, je n'ai pas réussi à obtenir cet effet. Lorsque la vitesse est inférieure à zéro, elle continue de diminuer régulièrement de 0,25 plutôt que le schéma décrit ci-dessus. Plutôt que de stocker les parties entières et fractionnaires séparément, je les stocke ensemble dans un seul flotteur.
Comment obtenir cet effet?
la source
Réponses:
Fondamentalement, il vous suffit de soustraire 64
low
pour soustraire 0,25, car une valeur de 8 bits peut avoir 256 valeurs, donc 256 * 0,25 = 64 Lorsqu'il y a un sous-dépassement,low
soustrayez également 1 dehigh
.Avertissement: Ce code est intentionnellement erroné en ce qui concerne les nombres négatifs, il est censé modéliser les anomalies numériques décrites dans la question. Pour des raisons de comparaison, la mise en œuvre d'une classe de points négatifs appropriée pour la gestion des classes à virgule fixe se trouve au bas de cette réponse.
EDIT : J'ai également ajouté la conversion en float et de float et la sortie
La sortie générée est la même que dans votre tableau:
En revanche, cette classe de points fixes gère correctement les nombres négatifs:
la source