Ini adalah tindak lanjut dari pertanyaan ini , yang saya jawab, tetapi yang satu ini membahas topik yang jauh lebih spesifik.
Jawaban ini membantu saya memahami Sistem Entitas lebih baik daripada artikel.
Saya telah membaca (ya,) artikel tentang Sistem Entitas, dan itu memberi tahu saya hal berikut:
Entitas hanyalah id dan array komponen (artikel mengatakan bahwa menyimpan entitas dalam komponen bukanlah cara yang baik untuk melakukan sesuatu, tetapi tidak memberikan alternatif).
Komponen adalah potongan data, yang menunjukkan apa yang dapat dilakukan dengan entitas tertentu.
Sistem adalah "metode", mereka melakukan manipulasi data pada entitas.
Ini tampaknya sangat praktis dalam banyak situasi, tetapi bagian tentang komponen yang hanya kelas data mengganggu saya. Sebagai contoh, bagaimana saya bisa mengimplementasikan kelas Vector2D (Posisi) saya di Sistem Entitas?
Kelas Vector2D menyimpan data: koordinat x dan y, tetapi juga memiliki metode , yang sangat penting untuk kegunaannya dan membedakan kelas dari hanya dua elemen array. Metode contoh adalah: add()
, rotate(point, r, angle)
, substract()
, normalize()
, dan semua standar lainnya, metode yang berguna, dan benar-benar diperlukan bahwa posisi (yang merupakan contoh dari kelas Vector2D) harus memiliki.
Jika komponen itu hanya pemegang data, itu tidak akan dapat memiliki metode ini!
Salah satu solusi yang mungkin muncul adalah dengan mengimplementasikannya di dalam sistem, tetapi itu tampaknya sangat kontra-intuitif. Metode-metode ini adalah hal-hal yang ingin saya lakukan sekarang , membuatnya lengkap dan siap digunakan. Saya tidak ingin menunggu MovementSystem
sampai membaca beberapa set pesan mahal yang menginstruksikannya untuk melakukan perhitungan pada posisi suatu entitas!
Dan, artikel itu dengan sangat jelas menyatakan bahwa hanya sistem yang harus memiliki fungsionalitas apa pun , dan satu-satunya penjelasan untuk itu, yang dapat saya temukan, adalah "untuk menghindari OOP". Pertama-tama, saya tidak mengerti mengapa saya harus menahan diri dari menggunakan metode dalam entitas dan komponen. Memori overhead praktis sama, dan ketika digabungkan dengan sistem ini harus sangat mudah diimplementasikan dan digabungkan dengan cara yang menarik. Sistem, misalnya, hanya bisa memberikan logika dasar untuk entitas / komponen, yang mengetahui implementasinya sendiri. Jika Anda bertanya kepada saya - ini pada dasarnya mengambil barang dari ES dan OOP, sesuatu yang tidak dapat dilakukan menurut penulis artikel, tetapi bagi saya sepertinya praktik yang baik.
Pikirkan seperti ini; ada banyak jenis objek yang dapat digambar dalam game. Gambar lama yang polos, animasi ( update()
,, getCurrentFrame()
dll), kombinasi dari tipe primitif ini, dan semuanya dapat dengan mudah menyediakan draw()
metode untuk sistem render, yang kemudian tidak perlu peduli tentang bagaimana sprite dari suatu entitas diimplementasikan, hanya saja tentang antarmuka (menggambar) dan posisinya. Dan kemudian, saya hanya akan membutuhkan sistem animasi yang akan memanggil metode khusus animasi yang tidak ada hubungannya dengan rendering.
Dan satu hal lagi ... Apakah benar-benar ada alternatif untuk array ketika datang untuk menyimpan komponen? Saya tidak melihat tempat lain untuk menyimpan komponen selain array di dalam kelas Entity ...
Mungkin, ini adalah pendekatan yang lebih baik: menyimpan komponen sebagai properti entitas yang sederhana. Misalnya, komponen posisi akan dilem entity.position
.
Satu- satunya cara lain adalah dengan memiliki semacam tabel pencarian yang aneh di dalam sistem, yang mereferensikan entitas yang berbeda. Tapi itu tampaknya sangat tidak efisien dan lebih rumit untuk dikembangkan daripada sekadar menyimpan komponen dalam entitas.