Antecedentes:
Tengo un problema para obtener la curva de salto correcta para un proyecto de remake de plataformas retro mío. El juego original es para el NES, y la velocidad del jugador se almacena en dos partes separadas: un byte para el número entero y otro para la parte fraccionaria.
La gravedad se agrega a la velocidad Y del jugador a una velocidad de 0.25 / fotograma.
Cuando el jugador salta, su velocidad Y se establece en -4.64453125. El resto de la curva de salto se deja a la gravedad.
A medida que el jugador asciende, su velocidad vertical converge a 0 a una velocidad de 0.25 / cuadro. Sin embargo, cuando la velocidad del jugador alcanza un valor inferior a cero, la velocidad cambia siguiendo un patrón diferente. En lugar de disminuir constantemente en 0.25 cada cuadro, sigue este patrón:
[1.75, -0.25, -0.25, -0.25, 1.75, -0.25, -0.25, -0.25, 1.75, ...]
Parece tener algo que ver con el desbordamiento de enteros.
Datos:
Aquí hay un volcado de los datos del original. Es una tabla de la velocidad.
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
Problema:
En mi juego no he podido lograr este efecto. Cuando la velocidad es menor que cero, continúa disminuyendo regularmente en 0.25 en lugar del patrón descrito anteriormente. En lugar de almacenar las partes enteras y fraccionarias por separado, las estoy almacenando juntas en un solo flotador.
¿Cómo se puede lograr este efecto?
fuente
Respuestas:
Básicamente, solo tiene que restar 64
low
para restar 0.25, porque un valor de 8 bits puede tener 256 valores, entonces 256 * 0.25 = 64 cuando hay un flujo inferior enlow
restar también 1high
.Descargo de responsabilidad: este código es intencionalmente incorrecto cuando se trata de números negativos, se supone que modela las anomalías numéricas descritas en la pregunta. Por razones de comparación, la implementación de una clase adecuada de manejo de números negativos se puede encontrar al final de esta respuesta.
EDITAR : También agregué la conversión a flotante y de flotante y la salida
El resultado generado es el mismo que en su tabla:
En contraste, esta clase de punto fijo maneja los números negativos correctamente:
fuente