Tło:
Mam problem z poprawieniem krzywej skoku dla mojego projektu remake'u retro platformówki. Oryginalna gra przeznaczona jest dla NES, a prędkość gracza jest przechowywana w dwóch oddzielnych częściach: jeden bajt dla liczby całkowitej i drugi dla części ułamkowej.
Grawitację dodaje się do prędkości Y gracza z szybkością 0,25 / klatkę.
Kiedy gracz skacze, jego prędkość Y jest ustawiona na -4,64453125. Reszta krzywej skoku pozostawiona jest grawitacji.
W miarę wznoszenia się gracza jego prędkość pionowa zbliża się do 0 z szybkością 0,25 / klatkę. Gdy prędkość gracza osiągnie wartość mniejszą od zera, prędkość zmienia się według innego wzoru. Zamiast stale zmniejszać się o 0,25 na każdą klatkę, stosuje się następujący wzór:
[1.75, -0.25, -0.25, -0.25, 1.75, -0.25, -0.25, -0.25, 1.75, ...]
Wygląda na to, że ma to coś wspólnego z przepełnieniem liczb całkowitych.
Dane:
Oto zrzut danych z oryginału. To jest tabela prędkości.
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:
W mojej grze nie byłem w stanie osiągnąć tego efektu. Gdy prędkość jest mniejsza od zera, nadal zmniejsza się regularnie o 0,25 zamiast wzoru opisanego powyżej. Zamiast osobnego przechowywania całości i części ułamkowych, przechowuję je razem w jednym pływaku.
Jak można osiągnąć ten efekt?
źródło
Odpowiedzi:
Zasadniczo wystarczy odjąć 64
low
, aby odjąć 0,25, ponieważ 8-bitowa wartość może mieć 256 wartości, więc 256 * 0,25 = 64 Gdy występuje niedopełnienie,low
odejmij także 1high
.Uwaga: Ten kod jest celowo niepoprawny, jeśli chodzi o liczby ujemne, ma on modelować anomalie liczbowe opisane w pytaniu. Dla celów porównawczych wdrożenie właściwej liczby ujemnej obsługującej klasę punktów stałych można znaleźć na dole tej odpowiedzi.
EDYCJA : Dodałem również konwersję do float oraz z float i wyjścia
Wygenerowane dane wyjściowe są takie same jak w tabeli:
Natomiast ta klasa punktów stałych prawidłowo obsługuje liczby ujemne:
źródło