Jika Entitas tidak memiliki 'tipe' eksplisit (misalnya pemain) dan hanya kumpulan komponen, bagaimana cara mengidentifikasi entitas yang harus dan tidak seharusnya dikerjakan oleh sistem saya? Misalnya, dalam permainan Pong, dayung dan bola keduanya bertabrakan dengan batas jendela. Namun, sistem penanganan tabrakan untuk masing-masing akan berbeda, oleh karena itu sistem seharusnya tidak menangani entitas dengan tipe yang salah.
void PlayerCollisionSystem::update(std::vector<Entity *> entities) {
typedef std::vector<Entity *>::iterator EIter;
for (EIter i = entities.begin(); i != entities.end(); ++i) {
Entity *player = *i; // How do I verify that the entity is a player?
// Get relevant components.
PositionComponent *position = player->getComponent<PositionComponent>();
VelocityComponent *velocity = player->getComponent<VelocityComponent>();
SpriteComponent *sprite = player->getComponent<SpriteComponent>();
// Detect and handle player collisions using the components.
}
}
Baik pemain dan bola berbagi jenis komponen yang relevan untuk penanganan tabrakan namun implementasi sistem mereka akan berbeda.
Jika saya memiliki wadah semua entitas game, bagaimana cara mengidentifikasi tipe entitas tertentu tanpa mewarisi Entity
atau menyertakan variabel anggota seperti std::string type
, dalam hal mana entitas tidak lagi sekadar kumpulan komponen?
sumber
Suatu sistem hanya berguna jika bermanfaat. Jika suatu sistem di mana suatu entitas "hanya kumpulan komponen" kurang berguna daripada sistem di mana entitas sebagian besar merupakan "kumpulan komponen", maka lakukan itu .
Berhentilah mencoba membuat sistem "murni" dan fokus untuk membuat yang bagus yang melakukan apa yang Anda butuhkan. Gunakan komponen hingga komponen tidak lagi berguna bagi Anda. Kemudian gunakan sesuatu yang lain.
Anda sudah menghabiskan lebih banyak waktu untuk memikirkan hal ini daripada yang seharusnya.
sumber
Jika Anda ingin memberikan entitas tipe eksplisit, cara termudah adalah dengan menentukan variabel tipe dalam kelas entitas. Hanya pertahankan pola EC selama ini berguna.
Kalau tidak jenisnya tersirat melalui atribut komponen. Sebagai contoh, komponen fisika akan memiliki atribut untuk mobile vs stasioner. Sistem kemudian tahu kapan dua ponsel bertabrakan (bola dan dayung). Demikian pula Anda dapat memiliki atribut untuk bagaimana sistem tabrakan harus merespons. Hentikan saja obyeknya atau refleksikan? Melihat atribut seharusnya memberi Anda gagasan tentang apa entitas itu, tetapi itu tidak relevan. Sistem seharusnya tidak perlu tahu apa jenis entitas yang mereka kerjakan, mereka harus diberi informasi yang cukup menggunakan komponen yang disediakan untuk mereka.
Akhirnya, dapat menambahkan komponen tambahan yang berisi tipe, tetapi, seperti menambahkan tipe ke entitas, Anda akhirnya akan menulis banyak jenis kode spesifik, mengalahkan tujuan sistem EC.
sumber
Entitas adalah seperangkat komponen. Anda tidak dapat menetapkan label yang rapi ke set acak. Menyerahkan batasan tipe adalah harga untuk fleksibilitas yang luar biasa.
Tentu saja Anda dapat memiliki kelas entitas (diketik) khusus yang memberlakukan pembatasan pada komponen.
Idealnya komponen independen. Jadi solusi untuk masalah Anda adalah memanggil penanganan tabrakan pada setiap subkomponen, secara berurutan. Dalam aplikasi nyata ada saling ketergantungan dan masalah pemesanan. Jika itu masalahnya, Anda memerlukan logika 'dispatcher' di setiap metode kelas Entity.
sumber