Bagaimana cara saya mewakili proyektil dalam permainan video?

14

Saya membuat game penembak tetap sederhana, mirip dengan "Galaga" ,) sebagai bagian dari presentasi yang saya lakukan. Saya bertanya-tanya strategi dan struktur data apa yang akan digunakan orang untuk melacak proyektil, seperti laser yang ditembakkan dari pesawat ruang angkasa. Implementasi super sederhana yang saya gunakan, sebelumnya, adalah hanya mewakili setiap proyektil sebagai sebuah titik, dan memeriksa tabrakan dengan semua objek di TKP.

Namun, ini tampaknya mahal, dalam adegan besar dengan banyak proyektil; Saya bertanya-tanya apa jenis strategi atau implementasi yang digunakan untuk jenis penggunaan ini. Apa yang digunakan game seperti FPS untuk melacak proyektil (peluru, peluru tank, dll)?

Polaris878
sumber
5
Banyak game FPS beranggapan bahwa peluru itu instan, tetapi ada yang menghitung lintasan dan waktu tempuh.
John McDonald
2
+1 ini adalah pertanyaan yang bagus, dan saya juga tidak akan membatasi untuk 3d.
ashes999

Jawaban:

8

Untuk proyektil yang sangat cepat (seperti laser atau peluru), Anda dapat menggunakan, Ray .

Sinar memiliki titik awal dan titik akhir. Struktur data (sangat minim) untuk sinar adalah:

struct Ray
{
  Vector3f start, end ;
} ;

Terlihat seperti ini:

masukkan deskripsi gambar di sini

(Anda juga bisa men-cache vektor arah dan panjang, tapi saya menggunakan defn yang sangat sederhana di atas).

Jika sinar adalah sinar laser yang bergerak dengan kecepatan cahaya, Anda hanya perlu menahan sinar (seperti mulai dari nozzle senjata dan berakhir di dinding di suatu tempat) untuk beberapa bingkai. Apa pun yang memotong sinar setiap frame akan rusak.

Jika sinar itu adalah proyektil yang lebih lambat (seperti peluru, misalnya), jarak yang ditempuh peluru melalui timestep dimodelkan oleh sinar. Titik awal adalah tempat sinar berada di awal bingkai, dan titik akhir adalah tempat sinar akan berada setelah bingkai dilakukan. Apa pun yang menghalangi sinar peluru dirusak oleh peluru.

Sinar dapat secara efisien bertabrakan dengan bola, aabb, cembung cangkul dll. Periksa proyek Hullinator saya untuk program yang sedang berjalan (CTRL + Click to fire rays)

bobobobo
sumber
1
Sinar tidak bekerja dengan baik untuk banyak proyektil. Misalnya, setiap proyektil yang dapat dilemparkan, seperti cangkang tank. Sinar sangat bagus untuk proyektil tembakan lurus.
MichaelHouse
Nah, jika cangkang bergerak sangat lambat (dibandingkan dengan peluru atau laser), maka ya saya akan memodelkannya sebagai tubuh biasa (seperti halnya pemain)
bobobobo
7
Secara teknis, sinar adalah titik awal dan arah. Ini dapat ditentukan DENGAN titik awal dan titik lain, tetapi ini bukan bagian dari definisinya. Menurut definisi, sinar tidak terbatas, dan tidak memiliki titik akhir.
Casey Kuball
1
Anda benar, apa yang saya jelaskan sebenarnya adalah segmen garis , tetapi kebanyakan orang menyebutnya sinar ketika berbicara tentang deteksi tabrakan.
bobobobo
3

Menggunakan sinar bekerja dengan baik untuk proyektil perjalanan instan seperti peluru. Untuk proyektil yang memiliki kecepatan lebih lambat seperti tipe yang akan Anda gunakan untuk game luar angkasa Anda, masuk akal untuk melacak posisi mereka di dunia game seperti yang Anda lakukan pada entitas lain. Apa yang sering saya lakukan adalah memiliki kelas dasar yang disebut Entity yang berisi properti dari setiap objek permainan abadi - posisi, rotasi, kotak tabrakan, dll. Pemain saya digerakkan dan proyektil kemudian mewarisi ini dan dunia permainan saya hanya perlu tahu bagaimana menghadapi Entitas kelas super, bukan setiap jenis entitas individu.

Untuk meningkatkan kinerja, sangat umum untuk mengumpulkan benda apa pun yang akan Anda buat dan hancurkan sesering mungkin. Saat Anda membutuhkan proyektil baru yang akan Anda tarik dari pool ini, modifikasi proyektil baru sesuai kebutuhan dan kembalikan ke pool ketika sudah habis.

JPRO
sumber
2

Saat Anda ingin mengoptimalkan untuk deteksi tabrakan, Anda bisa menyimpan semua objek game dalam pohon dua atau tiga dimensi . Struktur data ini membuatnya sangat efisien untuk mengambil semua objek di area tertentu.

Namun, pohon biner memiliki kelemahan sehingga mudah rusak ketika benda ditambahkan, dihapus, dan diubah posisinya, sehingga Anda perlu menyeimbangkannya secara otomatis.

Kompromi yang akan lebih mudah diimplementasikan tetapi tidak seefisien akan menggunakan pendekatan berbasis chunk. Membagi bidang bermain menjadi kubus dan melacak objek mana yang menyentuh setiap kubus. Ketika Anda memeriksa tabrakan dengan objek, Anda hanya perlu memeriksanya terhadap daftar objek kubus yang disentuhnya (ganti "kubus" dengan "persegi panjang" untuk game 2d).

Philipp
sumber