Lebih menyenangkan dengan ES ...
Saat ini, saya memiliki beberapa sistem:
- Renderer (Atribut yang dapat diurai, Ubah atribut)
- Gerakan (Atribut bergerak, Atribut transformasi, Atribut yang dapat di render [untuk kotak pembatas, dll])
- Input (atribut InputReceiver)
- dll.
Saya menambahkan deteksi tabrakan. Pikiran pertama saya adalah menambahkan sistem baru yang melakukan tabrakan. Masuk akal bagi saya untuk menjaga ini terisolasi dari Motion
sistem karena tidak semua hal yang bergerak atau animasi harus berpartisipasi dalam deteksi tabrakan - kamera, kabut, dll - tetapi tampaknya Collision
dan Motion
saling tergantung.
Ketika Motion
memindahkan suatu entitas, transformasi perlu divalidasi dengan Collision
, dan gerakan itu dibatalkan, atau disesuaikan (memantul, berhenti di dinding, dll.).
Alternatifnya adalah membuat atribut Collidable yang mempertahankan referensi ke objek collision - kd-tree, octree, dll. Yang dibagikan di antara entitas yang dapat saling bertabrakan. The Motion
Sistem kemudian akan memeriksa atribut itu, dan menggunakannya untuk memeriksa atau menyesuaikan gerakan.
Dari perspektif kode, itu solusi yang dapat diterima. Namun, dari sudut pandang arsitektur ECS, tampaknya mendorong logika ke dalam Motion
sistem yang tidak berlaku untuk semua entitas yang memiliki Movable
atribut.
Saya juga bisa menyimpan vektor gerak pada Movable
atribut, dan memiliki Collider
sistem menyesuaikan Transform
sesuai kebutuhan, tapi itu akan melibatkan duplikasi fungsi antara Motion
dan Collider
, atau panggilan balik dari Collider
ke Motion
dengan beberapa data tentang lokasi tabrakan dan permukaan data untuk bounce / refleksi, dll .
Ini mungkin berada di bawah judul "hack kasus khusus" tetapi saya ingin mendapatkan beberapa masukan dari mereka yang pernah menangani ini sebelumnya tanpa membuat satu ton kode kasus tepi.
Pertanyaan Apa cara yang baik untuk menghindari kopling ketat antara gerak dan sistem tabrakan ketika tampaknya mereka membutuhkan pengetahuan satu sama lain?
Jawaban:
Anda terlalu memikirkannya. Di mesin saya, yang juga menggunakan sistem entitas-komponen, setiap
GameObject
dapat memiliki pointer ke aModuleCollision
.Apa yang terjadi ketika game diperbarui:
Update
fungsi untuk masing-masingGameObject
.Update
fungsi, masing-masingGameObject
hanya memperbarui kecepatan dan arahnya, bukan posisinya.GameObject
unggah posisi saat ini, kecepatan, dan arah ke posisinyaModuleCollision
, jika ada.ModuleCollision
dasar.UpdatePost
fungsi masing-masingGameObject
. Jika objek memiliki modul tumbukan, ia mengambil posisi, kecepatan, dan arah yang diperbarui dari modul tumbukan. Posisi diperbarui dengan kecepatan dan arah.GameObject
membangun sebuah matriks 3x3 akhir dari posisinya dan pos.Ya, ada beberapa duplikasi negara, tapi tidak apa-apa. Melakukan penanganan tabrakan pada a
ModuleCollision
adalah cara terbaik untuk melakukannya, karena jika tidak, Anda harus memeriksa masingGameObject
- masing untuk mengetahui apakah ia memilikiModuleCollision
pegangan.sumber
Saya akan melakukannya seperti ini ...
Memiliki tiga sistem:
Sistem pergerakan menerapkan kecepatan pada posisi. Sistem akselerasi memberikan gaya pada kecepatan. Sistem tumbukan mendeteksi tumbukan dan menerapkan gaya ke arah yang benar, atau, jika Anda ingin tumbukan kasar, secara langsung mengubah kecepatan.
Misalnya, Anda dapat menghitung sudut antara tabrakan menggunakan atan2 , dan kemudian menggunakannya untuk menerapkan gaya / kecepatan yang benar pada benda.
Suruh sistem deteksi tabrakan menyiarkan pesan jika diperlukan juga.
sumber