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?