Sejauh ini sistem komponen entitas yang saya gunakan sebagian besar bekerja seperti artemis Java:
- Semua data dalam komponen
- Sistem independen tanpa kewarganegaraan (setidaknya pada tingkat yang mereka tidak memerlukan input pada inisialisasi) iterasi atas setiap entitas yang hanya berisi komponen yang tertarik sistem tertentu
- Semua sistem memproses entitas mereka satu centang, kemudian semuanya dimulai kembali.
Sekarang saya mencoba menerapkan ini pada permainan berbasis giliran untuk pertama kalinya, dengan banyak acara dan respons yang harus terjadi dalam urutan yang diatur relatif terhadap satu sama lain, sebelum permainan dapat melanjutkan. Sebuah contoh:
Pemain A menerima kerusakan dari pedang. Menanggapi ini, baju besi A menendang dan menurunkan kerusakan yang terjadi. Kecepatan gerakan A juga diturunkan karena semakin lemah.
- Kerusakan yang terjadi adalah yang memicu keseluruhan interaksi
- Armor harus dihitung dan diterapkan pada kerusakan yang masuk sebelum kerusakan diterapkan pada pemain
- Pengurangan kecepatan gerakan tidak dapat diterapkan ke unit sampai setelah kerusakan benar-benar ditangani, karena itu tergantung pada jumlah kerusakan akhir.
Acara juga dapat memicu acara lainnya. Mengurangi kerusakan pedang menggunakan baju besi dapat menyebabkan pedang hancur (ini harus terjadi sebelum pengurangan kerusakan selesai), yang pada gilirannya dapat menyebabkan peristiwa tambahan sebagai tanggapan terhadapnya, pada dasarnya evaluasi peristiwa secara rekursif.
Secara keseluruhan, ini tampaknya mengarah pada beberapa masalah:
- Banyak siklus pemrosesan yang terbuang: Sebagian besar sistem (simpan untuk hal-hal yang selalu berjalan, seperti rendering) sama sekali tidak memiliki sesuatu yang layak dilakukan ketika itu bukan "giliran mereka" untuk bekerja, dan menghabiskan sebagian besar waktu menunggu permainan untuk masuk kondisi kerja yang valid. Ini mengotori setiap sistem dengan cek yang terus bertambah besar semakin banyak status ditambahkan ke dalam game.
- Untuk mengetahui apakah suatu sistem dapat memproses entitas yang ada dalam game, mereka memerlukan beberapa cara untuk memantau status entitas / sistem yang tidak terkait (sistem yang bertanggung jawab untuk menangani kerusakan perlu mengetahui apakah armor telah diterapkan atau tidak). Ini bisa mengacaukan sistem dengan banyak tanggung jawab, atau menciptakan kebutuhan akan sistem tambahan tanpa tujuan lain selain memindai koleksi entitas setelah setiap siklus pemrosesan dan berkomunikasi dengan satu set pendengar dengan memberi tahu mereka kapan boleh melakukan sesuatu.
Dua poin di atas mengasumsikan bahwa sistem bekerja pada himpunan entitas yang sama, yang pada akhirnya mengubah status menggunakan flag dalam komponen mereka.
Cara lain untuk menyelesaikannya adalah dengan menambah / menghapus komponen (atau membuat entitas yang sama sekali baru) sebagai hasil kerja sistem tunggal untuk memajukan status permainan. Ini berarti bahwa setiap kali suatu sistem benar-benar memiliki entitas yang cocok, ia tahu bahwa ia diizinkan untuk memprosesnya.
Namun ini membuat sistem bertanggung jawab untuk memicu sistem selanjutnya, sehingga sulit untuk mempertimbangkan perilaku program karena bug tidak akan muncul sebagai hasil dari interaksi sistem tunggal. Menambahkan sistem baru juga semakin sulit karena mereka tidak dapat diimplementasikan tanpa mengetahui persis bagaimana mereka mempengaruhi sistem lain (dan sistem sebelumnya mungkin harus dimodifikasi untuk memicu keadaan sistem baru tertarik), agak mengalahkan tujuan memiliki sistem yang terpisah dengan satu tugas.
Apakah ini sesuatu yang harus saya jalani? Setiap contoh ECS tunggal yang saya lihat adalah waktu nyata, dan sangat mudah untuk melihat bagaimana loop satu iterasi per game ini bekerja dalam kasus seperti itu. Dan saya masih membutuhkannya untuk rendering, sepertinya benar-benar tidak cocok untuk sistem yang menghentikan sebagian besar aspek itu sendiri setiap kali sesuatu terjadi.
Apakah ada beberapa pola desain untuk memajukan kondisi permainan yang cocok untuk ini, atau haruskah saya memindahkan semua logika dari loop dan alih-alih memicunya hanya saat diperlukan?