Saya mengalami beberapa kesulitan mencari cara untuk berurusan dengan manajemen negara di entitas saya.
Saya tidak memiliki masalah dengan manajemen status Game, seperti jeda dan menu, karena ini tidak ditangani sebagai sistem komponen entitas; hanya dengan keadaan dalam entitas / komponen.
Menggambar dari Orc Must Die sebagai contoh, saya memiliki entitas MainCharacter dan Trap saya yang hanya memiliki komponen mereka seperti PositionComponent, RenderComponent, PhysicsComponent.
Pada setiap pembaruan Entitas akan memanggil pembaruan pada komponen-komponennya. Saya juga memiliki EventManager generik dengan pendengar untuk berbagai jenis acara.
Sekarang saya harus bisa menempatkan jebakan: pertama pilih jebakan dan posisi jebakan kemudian tempat jebakan.
Ketika menempatkan jebakan, jebakan itu akan muncul di depan MainCharacter, ditampilkan dengan cara yang berbeda dan mengikutinya. Ketika ditempatkan itu harus merespon tabrakan dan diberikan dengan cara normal.
Bagaimana ini biasanya ditangani dalam sistem berbasis komponen?
(Contoh ini spesifik tetapi dapat membantu mencari cara umum untuk menangani status entitas.)
sumber
Jawaban:
Salah satu aplikasi sistem komponen yang menarik adalah Anda dapat mengubah komponen entitas saat runtime jika Anda mendesainnya agar dapat menangani hal itu. Keadaan suatu entitas dengan demikian menjadi jumlah komponen mana yang ditugaskan padanya dan nilai mana yang dipegangnya.
Sebagai contoh Anda, pertama-tama Anda dapat membuat perangkap dengan
BuildControllerComponent
(mengatur reaksi terhadap kontrol pemain dalam fase build), aPositionComponent
dan aRenderComponent
. Yang terakhir memiliki satu bidang data yang mengatur pixel shader (s) yang digunakan, dan salah satunya memberikan trap-to-be-build tampilan "ghostly". Anda akan melihat belum ada komponen fisika yang ditetapkan.Setelah menempatkan jebakan, komponen-komponen tersebut dipertukarkan. Tidak
BuildControllerComponent
diperlukan lagi, jadi itu dihapus. TheRenderComponent
shader 's diganti dengan yang normal tampilan standar Anda dari perangkap. Akhirnya,PhysicsComponent
serta apa pun yang dibutuhkan untuk perangkap untuk bekerja ditambahkan ke entitas.Dalam pendekatan berbasis warisan, ini setara dengan memiliki konstruktor untuk
ActiveTrapEntity
kelas yang menggunakanBuildTimeTrapEntity
kelas sebagai argumennya, yang kedua digunakan untuk membuat perangkap selama membangunnya, yang pertama digunakan untuk perangkap setelah itu di tempat .sumber
BuildControllerComponent
?" atau "Apa posisi entitas ini sebagaimana dicatat dalam entitasnyaPositionComponent
, jika ada?" - yang Anda lakukan dengan memeriksa daftar komponen untuk komponen yang Anda minati dan secara opsional menanyakan (beberapa) nilainya.BuildControllerComponent
s. Itu sudah perlu memproses perubahan sudut pandang karakter pemain (atau kamera) dan acara tombol dan mouse.Saya tidak suka gagasan entitas memanggil pembaruan pada komponen mereka (sistem harus melakukan pekerjaan), dan itu akan menyebabkan masalah dengan menjaga komponen tidak saling menyadari.
Anda dapat menambahkan komponen tambahan yang disebut "Negara". Ini akan diakses oleh sistem render dan collision Anda. Komponen status hanyalah sebuah bendera yang memiliki banyak status tersedia untuknya. Untuk situasi yang Anda gambarkan keadaan akan
Play
danBuild
. Ketika sistem render melihat bahwa keadaanBuild
itu akan menarik objek tembus. Ketika sistem tumbukan melihatBuild
keadaan, itu tidak akan memproses tumbukan dengan pemain.Tetapi sungguh, jika Anda tidak memiliki sistem dan Anda mengandalkan komponen untuk melakukan semua pekerjaan Anda akan mengalami banyak masalah. Komponen seharusnya tidak saling mengetahui dan mereka tidak boleh melakukan pemrosesan.
sumber
StateComponent
yang dapat dikonsumsi oleh banyak sistem.