Saya sedang mengerjakan game balapan mobil dan baru saja mengimplementasikan sprite hantu untuk mengulang balapan sebelumnya. Saya menggunakan mesin fisika dan setelah banyak membaca saya sampai pada kesimpulan bahwa cara terbaik untuk menyimpan data hantu untuk replay adalah dengan merekam posisi dan rotasi mobil pada titik waktu tertentu, seperti misalnya dijelaskan di sini: https: // gamedev. stackexchange.com/a/8380/26261 .
Tapi apa cara yang baik untuk menemukan titik waktu selama replay? Contoh akan menjadi catatan dengan data ini:
time: +3.19932 (seconds since race start)
position: 180,40 (position at that time)
rotation: 30.4 (rotation at that time)
Tapi saya punya beberapa masalah dengan itu:
Ketika saya memutar ulang, tidak mungkin saya mencapai titik waktu yang tepat di 3.19932 lagi - lebih mungkin, saya akan memiliki titik waktu sekitar 3.1 dan harus menemukan catatan pencocokan terdekat. Saat interpolasi, bahkan pencocokan terdekat di atas dan di bawah. Ini kedengarannya sangat tidak efisien dan memakan waktu?
Di struktur daftar mana saya bisa menyimpan catatan ini untuk pemutaran ulang nanti? Array? Bukankah itu berarti bahwa waktu pencarian untuk catatan yang cocok dengan waktu tertentu akan meningkat semakin lama balapan?
Frekuensi mana yang harus saya gunakan untuk titik waktu? Setiap frame akan menjadi - saya kira - berlebihan, bukan saya harus menyimpan yaitu setiap frame n dan interpolasi di antaranya, yang membuat pertanyaan penyimpanan di 2. bahkan lebih sulit.
Jadi, apakah gagasan ini bahkan merupakan pendekatan yang tepat? Jika ya, bagaimana saya bisa menyimpan dan mengambil data secara efisien? Harap dicatat bahwa saya biasanya ingin menggunakan struktur data di atas, bukan gamestate deterministik dan merekam input pengguna, dll.
Terima kasih atas bantuannya!
EDIT: Saya sadar saya harus menggambarkan lingkungan yang saya gunakan: Cocos2D untuk iPhone. Ada sebuah metode update:(ccTime)delta
. Idealnya, metode ini akan dipanggil setiap 1/60 detik, tetapi tidak ada jaminan - delta
adalah waktu yang sebenarnya berlalu sejak gametick terakhir dan bisa lebih atau kurang dari 1/60. Dalam metode ini saya ingin menyimpan gamestate saat ini.
Jawaban:
Tidak :)
Katakanlah Anda menyimpannya sebagai array (perhatikan snapshot dalam urutan kronologis, tetapi tidak merata spasi):
Lalu, ketika replay / game dimulai, Anda mendapatkan elemen pertama dan kedua dari array:
Kemudian di setiap frame (
currentTime
adalah waktu saat ini di game baru ini):Tentu saja ini bisa dioptimalkan dengan caching beberapa perhitungan. Tidak ada pencarian melalui array, hanya mencari indeks tertentu.
sumber
Itu tidak terlalu sulit. Anda dapat menyimpan data Anda pada titik waktu yang sewenang-wenang (semakin banyak, semakin baik), dan Anda dapat menginterpolasi nilai data berdasarkan cap waktu yang Anda cari dan data dari dua cap waktu terdekat, misalnya:
Sekarang bayangkan Anda ingin mendapatkan posisi dan rotasi pada waktu 0,10. Karena 0,10 berada di antara poin '1' (berarti 0,05 waktu) dan '2' (berarti 0,15 waktu), Anda perlu menginterpolasi ini.
Lerp
hanya interpolasi linier .Jadi mari kita isi celah dengan beberapa contoh (*).
HTH.
sumber