Latar Belakang:
Saya mengalami masalah dalam mendapatkan kurva lompatan yang benar untuk proyek pembuatan ulang platformer retro milik saya. Gim asli untuk NES, dan kecepatan pemain disimpan dalam dua bagian terpisah: satu byte untuk seluruh angka dan satu lagi untuk bagian fraksional.
Gravity ditambahkan ke kecepatan Y pemain pada kecepatan 0,25 / frame.
Ketika pemain melompat, kecepatan Y-nya diatur ke -4.64453125. Sisa kurva lompat dibiarkan gravitasi.
Sebagai pemain naik kecepatan vertikalnya menyatu ke 0 pada tingkat 0,25 / frame. Ketika kecepatan pemain mencapai nilai kurang dari nol, bagaimanapun, kecepatan berubah mengikuti pola yang berbeda. Alih-alih menurun terus setiap 0,25 setiap frame, itu mengikuti pola ini:
[1.75, -0.25, -0.25, -0.25, 1.75, -0.25, -0.25, -0.25, 1.75, ...]
Tampaknya ada hubungannya dengan integer overflow.
Data:
Ini adalah dump data dari aslinya. Ini adalah tabel kecepatannya.
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
Masalah:
Dalam permainan saya, saya belum bisa mencapai efek ini. Ketika kecepatan kurang dari nol, ia terus menurun secara teratur sebesar 0,25 daripada pola yang dijelaskan di atas. Alih-alih menyimpan keseluruhan dan bagian-bagian pecahan secara terpisah, saya menyimpannya bersama dalam satu pelampung.
Bagaimana efek ini bisa dicapai?
sumber
Jawaban:
Pada dasarnya Anda hanya perlu mengurangi 64 dari
low
untuk mengurangi 0,25, karena nilai 8 bit dapat memiliki nilai 256, jadi 256 * 0,25 = 64 Ketika ada underflowlow
juga kurangi 1 darihigh
.Penafian: Kode ini sengaja salah ketika berbicara tentang angka negatif, ia seharusnya memodelkan anomali numerik yang dijelaskan dalam pertanyaan. Untuk alasan perbandingan, penerapan angka negatif yang tepat yang menangani kelas titik tetap dapat ditemukan di bagian bawah jawaban ini.
EDIT : Saya juga menambahkan konversi ke float dan dari float dan output
Output yang dihasilkan sama dengan di tabel Anda:
Sebaliknya kelas titik tetap ini menangani angka negatif dengan benar:
sumber