Haruskah saya menulis mesin fisika saya sendiri, karena integrasi jaringan?

11

Saat ini saya sedang mengembangkan penembak zombie top down, realtime,. Saya coding ini di Jawa, menggunakan JBox2D sebagai mesin fisika saya. Saya telah mengkode jaringan minggu ini, dan sekarang saya sampai ke sinkronisasi fisika.

Saya berencana untuk menggunakan model server klien / otoritas yang dapat diprediksi, di mana klien bebas bergerak, selama server menyetujuinya nanti. Ini melibatkan klien mengirim paket yang berisi data perpindahan ke server, dan server menghitung latensi, dan mensimulasikan kembali dunia dari keadaan yang lebih lama.

Masalah saya adalah, mesin fisika saya saat ini, JBox2D (pada dasarnya port dari Box2D), tidak mendukung memutar kembali dunia, dan tampaknya tidak mudah untuk membuat serialisasi data dunia. Saya punya 2 solusi, saya bisa memodifikasi / memperluas mesin fisika saya saat ini, atau menulis sendiri.

Alasan untuk menulis mesin fisika saya sendiri -

  • Saya dapat menghapus fitur yang tidak perlu. Dalam permainan top down, saya hanya benar-benar membutuhkan mekanik tabrakan, dan kekuatan penanganan. Tidak ada gravitasi yang terlibat.
  • Saya dapat memahami kode dengan lebih baik, dan [kemungkinan besar] akan lebih mudah untuk menerapkan fungsi roll back

Alasan untuk memperpanjang / memodifikasi JBox2D

  • Menulis mesin fisika saya sendiri, akan menjadi pekerjaan yang signifikan, yang bisa jadi rumit
  • JBox2D memiliki komunitas yang sangat mendukung, yang dapat membantu saya dengan dev saya
  • JBox2D, memiliki optimasi khusus, untuk hal-hal seperti deteksi tabrakan, yang membuatnya berguna
  • Beberapa pekerjaan telah dilakukan dalam hal ini, tetapi sedikit kode yang telah dibagikan

Jadi, apa pendapat Anda? Ini adalah game pertama saya, dan saya bukan pengembang game profesional. Kalau ada yang bisa memberikan beberapa tautan untuk pekerjaan yang sudah dilakukan di daerah (sebaiknya menggunakan JBox2D / Box2D / Java).

liamzebedee
sumber
Perhatikan juga bahwa jika Anda menggunakan JBox2D, Anda harus menggunakan di strictfpmana-mana, yang akan berdampak serius pada kinerja. Kalau tidak, server dan klien mungkin tidak mendapatkan hasil yang persis sama. Saya akan merekomendasikan menggunakan titik tetap sebagai gantinya.
sam hocevar

Jawaban:

7

Deteksi tabrakan dalam 2D ​​sangat sederhana. Saya tidak tahu mengapa Anda akan repot-repot menggunakan mesin fisika. Dan karena semua kekuatan penanganan lurus ke depan atau pada kurva (tidak jatuh, mengubah diagnosa dll.) Secara pribadi itu tidak punya otak bagi saya yang harus Anda pilih. Membuat sendiri itu sederhana. Tabrakan:

akun untuk 3 kemungkinan tabrakan yang dapat terjadi dalam 2 persegi panjang:

  1. Ujung ke ujung: Cukup sederhana, Anda mendapatkan sumbu dari satu sisi, dan lainnya dan Anda memutuskan apakah mereka menempati ruang yang sama atau cukup dekat untuk itu.
  2. Ujung ke ujung: Ini akan dengan mudah menjadi yang paling umum jika Anda memiliki bentuk yang berputar. Untungnya, ini juga cukup sederhana untuk diterapkan.
  3. Dari sudut ke sudut: Ini akan terjadi sangat jarang sehingga tidak layak untuk diimplementasikan. Alasan untuk itu, adalah bahwa 2 hal harus bergerak ke arah yang persis berlawanan pada sumbu yang sama persis ke mesin Anda desimal yang terakhir dihitung. Sekarang, jika semuanya berputar dengan 45 atau 90 derajat, MUNGKIN ini (bahkan mungkin masih belum) layak termasuk

EDIT: Seperti dikomentari, saya jauh kurang akrab dengan masalah ini, dan tidak boleh berkonsultasi tentang tabrakan peluru / proyektil.

Ketika saya telah bekerja dengan peluru di ruang 2D, saya menggunakan semacam jalur yang bekerja di kedua garis lurus dan melengkung di mana saya akan melempar proyektil menggunakan mesin fisika (yang saya tidak buat dari awal) dan menggunakan tabrakan standar.

Baca tentang membangun ini dari awal di komentar.


EDIT: * Percayalah, * terlepas dari mana, Anda akan memerlukan beberapa bentuk perhitungan mati di mesin gim Anda, karena proyektil dan berapa banyak proyektil yang dapat ditampilkan di layar pada waktu tertentu. Anda benar-benar tidak ingin memperbarui setiap peluru di layar per frame di lokasi yang diberikan itu. Tapi itu cara yang bagus untuk membuat game menjadi lambat: D! Anda seharusnya hanya memperbarui hal-hal ini:

  • Sebuah proyektil sedang dilemparkan
  • Arahnya dilemparkan
  • Apakah itu melengkung atau tidak
    • Dan jika demikian, apa fungsi kurva
  • Proyektil apa itu (Ini menjelaskan grafik, efek, kerusakan, semuanya)

Sekarang perbarui data di mesin sesuai dengan data itu, bukan pada server untuk setiap proyektil sialan, dan kirim paket data untuk setiap peluru. (Bayangkan melakukan itu bahkan dengan hanya 2 senapan mesin di layar! Yesus!)

Joshua Hedges
sumber
Tentu saja ini relatif mudah diimplementasikan, tetapi saya juga tertarik pada optimalisasi deteksi tabrakan, yang saya tidak tahu bagaimana cara mengimplementasikannya.
liamzebedee
Metode yang saya jelaskan tidak akan memerlukan optimasi jika Anda melakukannya seperti yang dijelaskan. Satu-satunya optimisasi yang mungkin diperlukan, adalah waktu Anda melakukan pra-cek, dan seberapa sering tabrakan benar-benar diperbarui. Contoh: Mereka BENAR-BENAR hanya perlu diperbarui ketika ada kemungkinan tabrakan.
Joshua Hedges
Untuk memperluas apa yang saya nyatakan terakhir. Anda hanya perlu memeriksa tabrakan bangunan misalnya, ketika karakter Anda bergerak di tempat pertama. Anda hanya perlu memeriksa tabrakan unit, ketika Anda bahkan memiliki unit dalam pandangan yang bukan karakter Anda. Anda hanya perlu memeriksa tabrakan proyektil, ketika mereka bahkan ada (pada saat itu). Anda dapat melewati segala bentuk deteksi tipe tabrakan (apakah itu ujung ke ujung? Sudut ke ujung? Dll.) Setelah Anda tahu bahwa ada sesuatu yang menyentuh sesuatu yang lain atau dekat dengannya. Kalau tidak, lewati saja.
Joshua Hedges
Kecuali ketika saya sedang memproses sisi server tabrakan, di mana saya perlu mendeteksi tabrakan untuk banyak pemain dll.
liamzebedee
4
@ MadPumpkin: terlalu percaya diri Anda mencerminkan buruk pada jawaban Anda; Anda berbicara tentang mendeteksi tabrakan, namun Anda tidak menyebutkan deteksi tabrakan yang merupakan inti absolut dari penanganan peluru yang tepat dalam penembak 2D. Juga, bahkan dengan penyapuan, resolusi adalah sama pentingnya dengan deteksi karena Anda perlu memutuskan tabrakan mana yang terjadi terlebih dahulu, menyelesaikan potensi konflik, dan mungkin memulai seluruh resolusi lagi dalam kasus entitas yang dihapus. Tentu saja bukan masalah sepele yang tampaknya Anda maksudkan.
sam hocevar