Saya telah bermain-main dengan dasar-dasar mesin game Java, dan saya telah mencapai titik di mana saya siap untuk menambahkan dalam sistem Event Manager.
Saya tahu, secara teori , apa yang harus dilakukan oleh seorang Manajer Acara: mengizinkan objek untuk "mendaftar" untuk acara tertentu, dan setiap kali Manajer Acara diberitahu tentang suatu peristiwa, menyiarkan acara itu kepada pendengar "yang terdaftar". Apa yang saya bingung adalah bagaimana memulai mengimplementasikannya.
Saya belum dapat menemukan apa pun, online, tentang penerapan sistem acara dari awal, jadi saya mencari masukan tentang praktik terbaik apa yang ada dalam kasus ini - apa yang seharusnya dan tidak seharusnya saya lakukan.
Misalnya, apakah benar-benar diperlukan untuk setiap objek game saya untuk memiliki EventManager
bidang? Karena semua objek game saya mewarisi dari satu, kelas induk abstrak, saya pikir saya harus dapat menggunakan referensi statis sehingga hanya ada satu instance dari Event Manager, dibagi di antara semua objek game. Saya melakukan sesuatu yang serupa, dengan Applet, yang saya gunakan untuk membuat setiap objek, sudah.
Saya kira saya harus memelihara koleksi semacam untuk setiap acara berlangganan yang mungkin - menambah dan menghapus objek game dari daftar, sesuai kebutuhan. Saya pikir seharusnya dimungkinkan untuk membuat antrian acara yang perlu disiarkan, dalam hal ini saya cukup menambahkan "EventManager.Update ()" ke loop permainan utama, dan minta Update()
metode menyiarkan peristiwa yang terjadi di akhir dari setiap bingkai. Akhirnya, setiap objek akan memiliki HandleEvent(Event e)
metode, yang kemudian dapat diurai dan ditanggapi dengan tepat.
Apakah ini terdengar seperti arah yang tepat untuk menerapkan sistem seperti itu, atau apakah saya keluar jalur dan / atau melewatkan sesuatu yang cukup jelas?
Jawaban:
Ini bisa sesederhana yang Anda inginkan.
Jangan mencoba dan mencari tahu apa yang harus dilakukan oleh seorang manajer acara - cari tahu apa yang perlu Anda lakukan. Selebihnya harus mengikuti dari sana, atau setidaknya, harus menyarankan beberapa pertanyaan yang lebih spesifik.
sumber
Tiga metode penting yang dibutuhkan sistem peristiwa adalah metode addListener (), metode removeListener (), dan metode untuk dispatchEvent (). Artinya, metode objek digunakan untuk mendaftar untuk suatu acara, metode objek digunakan untuk membatalkan pendaftaran, dan metode untuk benar-benar menyiarkan acara ke semua pendengar. Yang lainnya adalah saus.
Seperti yang Anda perhatikan, Anda tentu membutuhkan semacam struktur data untuk melacak pendengar yang terdaftar. Pendekatan paling sederhana adalah array asosiatif (Kamus, atau Objek dalam JavaScript) yang mengaitkan vektor (atau hanya Array tergantung pada bahasa) dengan suatu peristiwa. Vektor itu adalah daftar semua pendengar terdaftar; tambahkan pendengar ke daftar atau hapus mereka dalam metode add / removeListener ().
Untuk menyiarkan suatu peristiwa di dispatchEvent () itu bisa sesederhana perulangan melalui vektor. Anda dapat menambahkan lebih banyak kerumitan untuk pengiriman dengan menyortir prioritas acara atau apa pun, tetapi jangan khawatir tentang hal itu sampai Anda membutuhkannya. Dalam banyak kasus Anda tidak akan membutuhkannya.
Ada sedikit nuansa untuk dispatchEvent () ketika Anda mempertimbangkan data apa yang harus diteruskan dengan acara tersebut. Pada tingkat paling dasar Anda mungkin tidak akan melewatkan data tambahan apa pun; yang harus diketahui pendengar hanyalah bahwa suatu peristiwa terjadi. Namun sebagian besar acara memiliki data tambahan yang menyertainya (mis. Di mana peristiwa itu terjadi) untuk Anda ingin dispatchEvent () menerima dan melewati beberapa parameter.
Ada banyak cara untuk memberikan semua objek game Anda referensi ke kelas EventManager. Referensi statis tentu saja satu arah; yang lainnya adalah dengan Singleton. Kedua pendekatan tersebut sangat tidak fleksibel, sehingga sebagian besar orang di sini merekomendasikan pelacak layanan atau injeksi ketergantungan. Saya sudah melakukan injeksi ketergantungan; itu berarti bidang EventManager terpisah untuk setiap objek, yang tampaknya ingin Anda hindari, tapi saya tidak yakin mengapa itu menjadi masalah. Ini tidak seperti ada banyak overhead dari menyimpan banyak petunjuk.
sumber
Dasar-dasar penanganan acara cukup sederhana.
Mengetahui hal ini (tetapi tidak tahu bagaimana mengimplementasikannya di Jawa), mudah dipahami bahwa Anda memerlukan beberapa penangan (fungsi untuk menangani acara) dan menambahkannya ke array (dengan pointer, dalam C) dipasangkan dengan nama acara. Setelah Anda memicu suatu peristiwa, Anda menyimpan nama acara yang dipicu dan argumennya di tumpukan, ini disebut kumpulan acara.
Kemudian Anda memiliki event digest (loop sederhana), yang muncul acara pertama di tumpukan itu, mencoba untuk menemukan penangan untuk itu, dan jika ada, jalankan dengan params.
Tentu saja, intisari acara ini dapat dipicu kapan pun Anda inginkan, misalnya sekali per bingkai setelah Anda memanggil
Update()
fungsi Anda .sumber
Untuk bidang EventManager, gunakan variabel statis. A Singleton untuk EventManager juga merupakan ide bagus.
Pendekatan Anda kedengarannya bagus, tetapi jangan lupa untuk membuatnya aman.
Adalah baik untuk mengeksekusi IO-Events sebelum atau setelah "GameEvent", jadi dalam satu frame setiap "GameEvent" berhubungan dengan data yang sama.
sumber