Tabrakan antar pemain dalam game balap multipemain

8

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.

Yozer
sumber
Apakah mungkin untuk meningkatkan timestep di server sehingga setidaknya ada sedikit koreksi? Sudahkah Anda mencoba membuat para pemain menggunakan data yang sama dengan yang dimiliki server (posisi terakhir yang dikirim serta posisi prediktif pemain lain)?
user3797758
Saran: Sudahkah Anda mencoba membuat server hanya menghitung tabrakan? Klien hanya akan digunakan untuk membuat dan mengirim / menerima data (dan bereaksi terhadap data apa pun yang diterimanya, tentu saja).
Greffin28

Jawaban:

1

Lakukan fisika hanya di server. Ini adalah contoh alur kerja:

  1. Klien menekan "steer left".
  2. Klien mengirimkan permintaan "steer left" ke server
  3. Server menerima data.
  4. Server mengarahkan instance klien di server ke kiri.
  5. Server mendeteksi ada tabrakan antar pemain.
  6. Server melakukan koreksi berdasarkan tabrakan.
  7. Server mengirimkan data posisi ke klien.
  8. Klien menerima data posisi.
  9. Klien menyesuaikan posisinya.
S. Tarık Çetin
sumber
0

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.

Andreas
sumber