Saya membuat game balap sederhana (pesawat ruang angkasa, tanpa gravitasi) menggunakan p2.js, phaser, dan node.js.
Apa yang telah saya lakukan: Klien menerima status dunia dari server:
- ekstrapolasi pemain lain berdasarkan kecepatan / posisi terbaru dari server
- periksa apakah prediksi sisi klien benar - jika tidak ada posisi yang berlaku dari server dan proses input yang tidak disadari server.
- langkah fisika tetap
Server:
- menerima input dari klien dan melamar
- langkah fisika tetap
- mengirimkan negara dunia ke setiap klien
Sekarang saya berjuang dengan tabrakan antar pemain. Pemain yang bertabrakan melompat sepanjang waktu selama tabrakan. Saya pikir itu karena prediksi sisi klien tidak menghitung hasil yang mirip dengan server.
Server tidak tahu semua input dari pemain (lag).
Pemain tidak memiliki posisi yang sama untuk bertabrakan dengan server (lag).
Menggabungkan kedua ini membuat klien untuk menyelesaikan tabrakan berbeda dari server dan ketika negara dunia tiba pemain harus membuat koreksi besar.
Jawaban:
Lakukan fisika hanya di server. Ini adalah contoh alur kerja:
sumber
Jika Anda ingin interaksi pemain terasa seketika maka ada beberapa pilihan. Jika tidak maka lakukan saja fisika di sisi server.
Opsi 1 : Sisi klien mendeteksi data tabrakan dan tabrakan dikirim ke server dan / atau langsung ke klien lain. Penembak multipemain tertentu melakukan pendeteksian tabrakan seperti ini karena jika tidak mekanisme penembakan tidak akan terasa akurat.
Opsi 2 : Sisi server melakukan fisika, tetapi membuat banyak prediksi berbeda. Anda bisa menggunakan lebih banyak instance dari setiap pemain dan memprediksi mereka melakukan hal yang sedikit berbeda. Pastikan mereka tidak bertabrakan sendiri dan mengirim data ke klien. Setiap kali gerakan pemain cocok dengan prediksi, Anda menggunakan data yang sudah dikirim ke klien.
sumber