Saya tahu pertanyaan ini telah ditanyakan beberapa kali, tetapi saya masih tidak yakin bagaimana menerapkan penanganan input pada mesin berbasis komponen.
Desain berbasis komponen yang saya gunakan didasarkan pada seri blog T = Machine dan pada Artemis di mana Entitas hanya id.
Ada tiga ide utama yang saya miliki dalam menerapkan penanganan input:
- Komponen input akan mengadakan acara yang menarik. Sistem input akan menerjemahkan peristiwa kunci dan mouse ke peristiwa permainan dan loop melalui entitas dengan komponen input dan jika mereka tertarik pada acara tersebut tindakan yang tepat akan diambil oleh sistem input. Tindakan ini akan sulit dikodekan ke sistem input.
- Tidak ada komponen input. Anda akan mendaftarkan entitas dengan acara khusus ke sistem input. Sistem input kemudian akan mengirim pesan (dengan id entitas dan tipe acara) ke sistem lain sehingga ini dapat mengambil tindakan yang sesuai. Atau seperti dalam kasus pertama, tindakan akan dikodekan ke sistem input.
- Mirip dengan metode pertama, tetapi alih-alih mengkodekan tindakan ke sistem input, komponen akan berisi peta peristiwa ke fungsi (yaitu
std::map<std::function>
) yang akan dipanggil oleh sistem input. Ini memiliki efek tambahan karena bisa memasangkan acara yang sama ke tindakan yang berbeda.
Apakah Anda merekomendasikan salah satu metode di atas atau apakah Anda memiliki saran yang akan membantu saya menerapkan sistem penanganan input yang fleksibel? Juga, saya belum terbiasa dengan multi-threading tetapi saran yang akan membuat implementasi thread-friendly juga diterima.
Catatan: Satu persyaratan tambahan yang ingin saya penuhi dari implementasi adalah bahwa saya dapat memberikan input yang sama ke banyak entitas, seperti misalnya memindahkan entitas kamera dan pemain pada saat yang sama.