Saya masih hijau untuk sistem entitas / komponen. Saya menemukan bahwa karena saya memiliki komponen yang berguna untuk menggambar sprite (atau spritesheets) dan menangani input (klik mouse / sentuhan), saya secara alami ingin menggunakan kembali ini untuk membuat komponen UI (seperti tombol, misalnya layar tingkat-pilih).
Ini menurut saya sangat aneh. Saya selalu memahami entitas sebagai "model permainan" hal-hal seperti pemain, musuh, power-up, dll. Di sisi lain, dari perspektif penggunaan kembali kode, menggunakan kembali komponen untuk UI masuk akal.
Bagaimana (dan di mana) kekhawatiran UI / GUI masuk ke dalam sistem entitas / komponen?
(Catatan: pertanyaan ini adalah platform agnostik karena berlaku untuk beberapa platform / bahasa)
2d
component-based
gui
ashes999
sumber
sumber
Jawaban:
Setelah menggunakan beberapa sistem entitas-komponen, terutama CraftyJS, saya kurang lebih mendapat jawaban untuk pertanyaan saya: ya, Anda dapat menggunakan kembali komponen (terutama sprite atau gambar dan penangan klik mouse di game 2D) untuk GUI.
Sebagian besar waktu, Anda hanya memiliki akses ke ECS, dan bukan sistem yang mendasarinya (mis. Sistem gambar). Dalam hal ini, boleh saja menggunakan komponen, karena Anda tidak punya pilihan lain.
Jika Anda memiliki akses ke sistem yang mendasarinya (mis. Ruby roguelike dengan akses langsung ke Curses), Anda mungkin menemukan bahwa menggambar / merender langsung pada sistem itu lebih efektif (lebih sedikit kode, kurang rapuh, lebih alami) daripada menggunakan banyak entitas dan komponen.
sumber
Dalam 2D atau 3D, sistem komponen entitas (ECS) setidaknya harus memiliki akses ke sistem GUI, jika itu bukan bagian dari ECS yang sama.
Secara pribadi, saya tidak akan mencampur keduanya. Penggunaan kembali kode untuk GUI hanya benar-benar terjadi di tingkat atas. Menanggapi mouse / keyboard, rendering, dan sebagainya. Fungsi yang diambil oleh tombol yang berbeda, atau informasi yang ditampilkan daftar tertentu sebenarnya bukan sesuatu yang dapat dibuat cukup umum untuk digunakan kembali.
Sebagai contoh, saya akan membayangkan komponen untuk entitas GUI akan seperti
position
,render
dangui
. Di mana komponen GUI akan menentukan jenis tindakan yang dilakukan entitas GUI. Namun, tindakan itu akan menjadi sangat unik dan spesifik konteks. Ini menghasilkan sistem yang menangani komponen GUI yang sangat besar dan pada dasarnya dirancang untuk menangani masing-masing fungsi GUI (memuat game, menyimpan game, mencari server, dll). Kedengarannya berantakan.Saya lebih suka melakukan file kelas standar untuk setiap "layar" GUI. Memiliki semua fungsionalitas untuk layar itu di satu tempat (dengan referensi ke kelas fungsionalitas umum). Ini jauh lebih rapi dan lebih mudah dikelola.
Namun, seperti yang saya katakan, ECS harus memiliki akses ke sistem GUI. Perlu untuk dapat memberikan informasi kepada GUI berdasarkan entitas dalam sistemnya. Misalnya, melayang di atas unit sekutu akan memunculkan jendela GUI dengan semua informasi tentang unit itu. Di mana melayang di atas kesatuan musuh akan muncul jendela GUI dengan informasi terbatas. Anda mungkin tidak ingin memprogram GUI untuk mengetahui perbedaan antara keduanya, Anda ingin meminta entitas untuk menampilkan informasinya.
Jadi, entitas kemungkinan masih memiliki beberapa jenis komponen GUI, tetapi mereka akan menjadi entitas "dalam game", bukan entitas GUI. Komponen ini akan menggunakan sistem GUI eksternal untuk membuat antarmuka GUI mereka.
sumber
TouchButton
yang terdiri dari spritesheet dan pendengar klik-sentuh. Untuk unit popup, saya mungkin akan mengimplementasikannya sebagai kombinasi komponen sprite + komponen pendengar tikus. Hmm.