Mencoba membungkus kepala saya di sekitar cara untuk menangani tabrakan dengan benar dalam permainan yang dirancang di sekitar komponen.
Saya melihat banyak contoh memiliki semacam PhysicsComponent
yang ditambahkan ke daftar komponen entitas tetapi implementasi sebenarnya membingungkan saya.
Agar ini berfungsi, PhysicsComponent
tentu perlu akses ke dunia di sekitarnya. Ini tidak masuk akal bagi saya. Bukankah seharusnya suatu komponen tidak menyadari tidak hanya wadahnya (entitas), tetapi wadah kontainernya (dunia)?
Bagi saya, kedengarannya seperti level atau adegan harus mempertahankan daftar entitas ini dan setiap pembaruan game, loop melalui entitas untuk menentukan yang bertabrakan.
Pertanyaan saya adalah pertama, apakah ini desain yang bagus atau tidak, dan kedua, bagaimana menentukan entitas mana yang dapat bertabrakan. Saya kira entitas yang solid dapat mengimplementasikan antarmuka IRigidBody kosong sehingga level dapat menentukan entitas mana dalam daftar yang mendukung tabrakan. Tetapi apakah ini melanggar desain komponen?
Sebaliknya, haruskah mereka mengandung komponen RigidBody kosong? Ini mungkin sebenarnya lebih baik karena tidak selalu kosong dan pendekatan ini lebih tahan masa depan. Satu-satunya masalah dengan ini adalah kompleksitasnya. Adegan harus melewati tidak hanya setiap entitas, tetapi juga komponen setiap entitas untuk menentukan apakah memiliki komponen RigidBody ini.
Ketiga, ketika mereka bertabrakan, kedua entitas harus diberitahu entah bagaimana dan saya tidak yakin bagaimana untuk mencapai ini.
Katakanlah kedua entitas mengandung HealthComponent dan ketika mereka bertabrakan, kesehatan mereka akan menurun dengan nilai sewenang-wenang, 5. Saya kira itu akan menjadi tanggung jawab TKP untuk menangani hal ini ketika mendeteksi tabrakan antara dua entitas?
Tapi apakah adegan terlalu banyak bertanggung jawab? Saya bisa melihat ini mungkin keluar dari tangan dan menjadi sulit ketika adegan bertanggung jawab atas banyak hal yang seharusnya tidak dimiliki entitas (?).
Sunting: Pertanyaan diperbarui dengan lebih detail.