Hintergrund:
Ich habe ein Problem damit, die Sprungkurve für ein Retro-Platformer-Remake-Projekt von mir zu korrigieren. Das ursprüngliche Spiel ist für das NES und die Geschwindigkeit des Spielers wird in zwei getrennten Teilen gespeichert: einem Byte für die ganze Zahl und einem anderen für den Bruchteil.
Die Schwerkraft wird zur Y-Geschwindigkeit des Spielers mit einer Rate von 0,25 / Frame addiert.
Wenn der Spieler springt, ist seine Y-Geschwindigkeit auf -4,64453125 eingestellt. Der Rest der Sprungkurve bleibt der Schwerkraft überlassen.
Wenn der Spieler aufsteigt, konvergiert seine vertikale Geschwindigkeit mit einer Geschwindigkeit von 0,25 / Bild gegen 0. Wenn die Geschwindigkeit des Spielers einen Wert unter Null erreicht, ändert sich die Geschwindigkeit jedoch nach einem anderen Muster. Anstatt sich mit jedem Frame stetig um 0,25 zu verringern, folgt es diesem Muster:
[1.75, -0.25, -0.25, -0.25, 1.75, -0.25, -0.25, -0.25, 1.75, ...]
Es scheint etwas mit Integer-Überlauf zu tun zu haben.
Daten:
Hier ist ein Dump der Daten aus dem Original. Es ist eine Tabelle der Geschwindigkeit.
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
Problem:
In meinem Spiel konnte ich diesen Effekt nicht erzielen. Wenn die Geschwindigkeit kleiner als Null ist, nimmt sie statt des oben beschriebenen Musters regelmäßig um 0,25 ab. Anstatt die gesamten und gebrochenen Teile getrennt zu lagern, lagere ich sie zusammen in einem einzigen Schwimmer.
Wie kann dieser Effekt erzielt werden?
quelle
Antworten:
Grundsätzlich müssen Sie nur 64 von
low
subtrahieren, um 0,25 zu subtrahieren, da ein 8-Bit-Wert 256 Werte haben kann, also 256 * 0,25 = 64 Wenn ein Unterlauf vorliegt,low
subtrahieren Sie auch 1 vonhigh
.Haftungsausschluss: Dieser Code ist absichtlich falsch, wenn es um negative Zahlen geht. Er soll die in der Frage beschriebenen numerischen Anomalien modellieren. Zu Vergleichszwecken finden Sie am Ende dieser Antwort die Implementierung einer korrekten Negativzahl für die Behandlung von Festkommaklassen.
EDIT : Ich habe auch die Konvertierung in float und from float und die Ausgabe hinzugefügt
Die generierte Ausgabe ist dieselbe wie in Ihrer Tabelle:
Im Gegensatz dazu behandelt diese Festkommaklasse die negativen Zahlen richtig:
quelle