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)?
game-design
design-patterns
Polaris878
sumber
sumber
Jawaban:
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:
Terlihat seperti ini:
(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)
sumber
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.
sumber
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).
sumber