Fundo:
Estou tendo um problema para corrigir a curva de salto de um projeto de remake de plataforma retro meu. O jogo original é para o NES, e a velocidade do jogador é armazenada em duas partes separadas: um byte para o número inteiro e outro para a parte fracionária.
A gravidade é adicionada à velocidade Y do jogador a uma taxa de 0,25 / quadro.
Quando o jogador pula, sua velocidade Y é ajustada para -4,64453125. O restante da curva de salto é deixado para a gravidade.
À medida que o jogador sobe, sua velocidade vertical converge para 0 a uma taxa de 0,25 / quadro. Quando a velocidade do jogador atinge um valor menor que zero, no entanto, a velocidade muda seguindo um padrão diferente. Em vez de diminuir constantemente em 0,25 a cada quadro, segue este padrão:
[1.75, -0.25, -0.25, -0.25, 1.75, -0.25, -0.25, -0.25, 1.75, ...]
Parece ter algo a ver com excesso de número inteiro.
Dados:
Aqui está um despejo dos dados do original. É uma tabela da velocidade.
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:
No meu jogo, não consegui alcançar esse efeito. Quando a velocidade é menor que zero, ela continua a diminuir regularmente em 0,25, em vez do padrão descrito acima. Em vez de armazenar as partes inteiras e fracionárias separadamente, estou armazenando-as juntas em uma única bóia.
Como esse efeito pode ser alcançado?
fonte
Respostas:
Basicamente, você só precisa subtrair 64 de
low
para subtrair 0,25, porque um valor de 8 bits pode ter 256 valores, então 256 * 0,25 = 64 Quando houver um subfluxo,low
também subtraia 1 dehigh
.Aviso Legal: Este código está intencionalmente errado quando se trata de números negativos, e deve modelar as anomalias numéricas descritas na pergunta. Por razões de comparação, a implementação de números negativos adequados que manipulam a classe de ponto fixo pode ser encontrada na parte inferior desta resposta.
EDITAR : Eu também adicionei a conversão para flutuar e de flutuar e a saída
A saída gerada é a mesma da sua tabela:
Por outro lado, essa classe de ponto fixo lida com os números negativos corretamente:
fonte