Saat ini saya menghadapi masalah berikut:
Saya mencoba untuk menulis klon pong dengan menggunakan sistem komponen entitas (ECS). Saya menulis "kerangka" sendiri. Jadi ada kelas yang mengelola entitas dengan semua komponen. Lalu ada kelas komponen itu sendiri. Dan terakhir ada sistem saya yang hanya mendapatkan semua entitas yang memiliki komponen yang dibutuhkan sistem.
Jadi misalnya sistem pergerakan saya mencari semua entitas yang memiliki komponen posisi dan komponen gerakan. Komponen posisi hanya menahan posisi dan komponen gerakan menahan kecepatan.
Tetapi masalah sebenarnya adalah sistem tabrakan saya. Kelas ini seperti gumpalan logis. Saya punya begitu banyak kasus khusus di kelas ini.
Sebagai contoh: Dayung saya dapat bertabrakan dengan perbatasan. Jika ini terjadi, kecepatannya disetel ke nol. Bola saya juga bisa bertabrakan dengan perbatasan. Tetapi dalam hal ini kecepatannya hanya dicerminkan pada batas normal sehingga tercermin. Untuk melakukan ini saya memberi bola komponen fisika tambahan yang hanya mengatakan: "Hei, benda ini tidak berhenti, itu mencerminkan." Jadi sebenarnya, komponen fisika tidak memiliki data nyata. Ini adalah kelas kosong yang hanya ada di sana untuk memberi tahu sistem jika suatu objek mencerminkan atau berhenti.
Lalu datang ini: Saya ingin memberikan beberapa partikel ketika bola bertabrakan dengan dayung atau perbatasan. Jadi saya pikir bola harus mendapatkan komponen lain yang memberitahu sistem tumbukan untuk membuat partikel pada tumbukan.
Kemudian saya ingin memiliki power up yang dapat bertabrakan dengan dayung tetapi tidak dengan perbatasan. Jika itu terjadi, power-up harus menghilang. Jadi saya akan membutuhkan lebih banyak case dan komponen (untuk memberi tahu sistem bahwa beberapa entitas hanya dapat bertabrakan dengan yang lain, bot tidak dengan semua bahkan jika beberapa yang lain benar-benar dapat bertabrakan, lebih jauh sistem tabrakan harus menerapkan power-up ke dayung, dll, dll, dll.).
Saya melihat bahwa sistem komponen entitas adalah hal yang baik karena fleksibel dan Anda tidak memiliki masalah dengan warisan. Tapi saya benar-benar terjebak saat ini.
Apakah saya berpikir terlalu rumit? Bagaimana saya harus mengatasi masalah ini?
Tentu, saya harus membuat sistem yang sebenarnya bertanggung jawab untuk "pasca-tabrakan", sehingga sistem tabrakan hanya mengatakan "Ya, kami memiliki tabrakan di frame terakhir" dan kemudian ada banyak sistem "pasca-tabrakan" yang semua membutuhkan komponen (kombinasi) yang berbeda dan kemudian mengubah komponen. Misalnya akan ada sistem pergerakan pasca-tabrakan yang menghentikan hal-hal yang harus berhenti ketika tabrakan terjadi. Kemudian sistem pasca-tabrakan fisika yang mencerminkan hal-hal, dll.
Tetapi ini sepertinya juga bukan solusi yang tepat bagi saya, karena misalnya:
- Sistem pasca-tabrakan gerakan saya akan membutuhkan entitas yang memiliki komponen posisi, komponen gerakan dan komponen tabrakan. Maka itu akan mengatur kecepatan entitas menjadi nol.
- Sistem fisika pasca-tabrakan akan membutuhkan entitas yang memiliki komponen posisi, komponen gerakan, komponen tabrakan, dan komponen fisika. Maka itu akan mencerminkan vektor kecepatan.
Masalahnya jelas: Gerakan pasca-tabrakan membutuhkan entitas yang merupakan subset dari entitas dalam fisika pasca-tabrakan. Jadi dua sistem pasca-tabrakan akan beroperasi pada data yang sama, efeknya adalah: Meskipun suatu entitas memiliki komponen fisika, kecepatannya akan menjadi nol setelah tabrakan.
Bagaimana masalah ini diselesaikan secara umum dalam sistem komponen entitas? Apakah masalah itu biasa atau apakah saya melakukan sesuatu yang salah? Jika ya, apa dan bagaimana seharusnya itu dilakukan?