Saya membuat kelas tombol yang menggambar tombol di layar. Ketika saya mengkliknya, saya ingin melihat sesuatu terjadi. Di WinForm, saya hanya akan menggunakan event OnClick tombol. Bagaimana dengan XNA?
Haruskah saya menambahkan acara OnClick ke kelas tombol saya? Apakah itu praktik yang baik? Jika tidak, bagaimana Anda menangani acara di loop game Anda?
Jawaban:
Satu-satunya alasan untuk tidak menggunakan
event
dalam gim adalah bahwa membuat delegasi untuk dilampirkan ke event handler menciptakan objek tumpukan yang dapat menyebabkan pengumpulan sampah yang dapat menyebabkan cegukan tingkat bingkai pada Xbox 360 (dan mungkin WP7, belum diuji Itu).Secara umum, ini seharusnya tidak relevan dengan UI game yang Anda set-up sekali dan cukup dijalankan.
Juga, memanggil event handler adalah sedikit, kecil, sedikit lebih lambat beberapa metode lain yang tersedia. Dan ini juga sama sekali tidak relevan untuk UI. (Ini hanya berlaku untuk pengerasan-angka yang dioptimalkan secara mikro).
Jadi, selama Anda tidak berlarian menugaskan event handler, mau tidak mau, maka pilihan menggunakan
event
dalam permainan tidak berbeda dengan pilihan menggunakan satu dalam aplikasi reguler.Menyalin desain WinForms untuk UI game Anda baik-baik saja.
(Ada baiknya menunjukkan satu peringatan dari peristiwa adalah bahwa mereka adalah "referensi kuat" yang tersembunyi yang dapat secara tidak sengaja menjaga objek tetap hidup jika Anda tidak menghapus pawang. Ini relevan untuk gim dan aplikasi reguler)
sumber
Sangat dapat diterima untuk menggunakan acara untuk menangani hal-hal seperti klik dan interaksi lainnya dengan antarmuka tombol Anda; itu tentu metode yang unggul untuk yang melibatkan subclass
Button
jenis untuk menerapkan perilaku yang disesuaikan.Alternatif lain yang tidak umum adalah melampirkan skrip ke tombol dan elemen UI lainnya, tetapi ini lebih terlibat (kecuali Anda sudah memiliki sistem skrip yang kuat) dan tidak selalu lebih baik.
Anda mungkin juga ingin melihat konsep " GUI mode langsung ," yang menyediakan cara lain untuk menangani input.
sumber
Ada tiga pendekatan umum yang saya lihat di mesin permainan, saya tidak yakin tentang XNA mendukung ketiganya tetapi di sini mereka:
Anda bisa mewarisi kelas dari kelas tombol Anda dan menimpa OnClickFunction di kelas CustomButton Anda. Keuntungannya adalah Anda tidak perlu memeriksa apakah tombol ditekan itu memberi tahu Anda setiap kali diklik tetapi mungkin menyebabkan pewarisan yang berlebihan.
Anda dapat mendefinisikan beberapa fungsi OnClick dan meneruskannya ke kelas butten OnClickEvent (sama seperti penanganan acara biasa c #). ini memiliki manfaat yang sama dengan yang sebelumnya dan Anda tidak perlu khawatir untuk pewarisan yang berlebihan.
Anda harus memeriksa di loop utama Anda apakah tombol ini diklik atau tidak. dalam metode ini bukan acara yang sebenarnya. jadi kekurangannya adalah Anda harus memeriksa diri sendiri setiap kali Anda harus melakukan sesuatu berdasarkan input tombol tetapi memiliki keuntungan bahwa Anda dapat mengontrol di mana tombol benar-benar diperiksa dan berlaku.
sumber
Saya berhenti menggunakan acara .net dan mulai menyimpan semua acara dan perubahan dalam buffer:
Pro:
Cons:
BTW terkadang saya menggunakan keduanya: model acara dan model buffer.
sumber