Saya memulai proyek game 'yang tepat' pertama saya, dan saya pasti akan berusaha keras untuk memutuskan bagaimana komponen-komponen game dalam XNA harus berkomunikasi.
Dari acara pemrograman GUI sebelumnya (Jawa), penangan dan pendengar tampak seperti jalan ke depan. Jadi saya akan memiliki semacam bus acara yang menerima pendaftaran acara dan kelas yang berlangganan acara-acara tersebut, dengan penangan untuk menghadapinya. Misalnya (kodesemu):
class SpriteManager
Update(){
if(player.collidesWith(enemy)
// create new 'PlayerCollisionEvent'
}
class HUDManager
onPlayerCollisionEvent(){
// Update the HUD (reduce lives etc)
}
Namun, saya tidak yakin tentang pengaturan kode (dalam C #) yang akan diperlukan untuk menyelesaikan ini sepenuhnya. Apa yang melacak peristiwa (semacam bus?), Dan bagaimana strukturnya?
Tampaknya juga ada banyak yang disebutkan tentang Layanan Game, di mana Anda dapat mendaftarkan GameComponent di kelas Game.cs utama Anda, lalu mengambilnya dari mana saja dalam kode Anda yang memiliki referensi ke objek 'Game' utama. Saya sudah mencoba ini dengan objek SpriteBatch saya dan sepertinya sangat mudah .. namun, saya tidak bisa melihat ini sefleksibel model acara.
Ambil contoh ketika musuh mati. Kami ingin memperbarui skor permainan. Dengan menggunakan layanan, saya bisa mendapatkan referensi ke objek StateManager saya yang dibuat di Game1 dan ditambahkan sebagai layanan, lalu atur 'skor' ke nilai baru. Saya akan berpikir acara 'onEnemyDeath', yang dapat ditangani secara berbeda oleh banyak kelas, tetapi diprakarsai oleh 1 baris kode di bagian 'deteksi kematian musuh' yang relevan, akan lebih baik daripada secara individual casting setiap GameComponent yang diperlukan kemudian memanggil apa pun metode diperlukan.
Atau apakah ini strategi yang lebih rendah daripada yang lain?
Saya menyadari ini adalah sebagian dari pengetahuan C # saya yang buruk seperti halnya paradigma komunikasi permainan, tetapi saya benar-benar ingin memperbaiki hal mendasar ini.
Memperbarui
Setelah melihat Layanan lebih detail saya kurang yakin - itu pada dasarnya melewati variabel global sekitar (dari apa yang saya mengerti).
Perbarui 2
Setelah melihat tutorial dasar tentang penanganan event dan pengujian kode sampel ini, sepertinya acara akan menjadi pilihan logis untuk apa yang saya diskusikan. Tapi saya tidak bisa banyak menggunakannya dalam sampel yang saya lihat. Adakah alasan yang jelas mengapa seseorang tidak melakukannya?
sumber
Jawaban:
Alasan Anda tidak akan menemukan banyak tentang bus acara di C # adalah karena saya tidak berpikir siapa pun di luar Jawa menyebut hal seperti itu 'bus', menurut pengalaman saya. Istilah yang lebih umum mungkin adalah antrian pesan, manajer acara, sinyal / slot, terbitkan / berlangganan, dll.
Anda tidak memerlukan semua itu untuk membuat game yang berfungsi, tetapi jika itu adalah jenis sistem yang Anda sukai, itu akan membantu Anda dengan baik di sini juga. Sayangnya tidak ada yang bisa memberi tahu Anda cara membuatnya karena semua orang menggulungnya sedikit berbeda, jika mereka menggunakannya sama sekali. (Saya tidak, misalnya.) Anda mungkin mulai dengan
System.Collections.Generic.List<Event>
antrian sederhana , dengan berbagai acara Anda menjadi subkelas Acara, dan daftar pelanggan untuk setiap jenis acara. Untuk setiap acara dalam antrian, dapatkan daftar pelanggan, dan untuk setiap pelanggan, panggilhandle(this_event)
saja. Kemudian hapus dari antrian. Ulang.Mungkin tidak fleksibel, tetapi lebih mudah untuk di-debug. Acara dan pesan rumit karena memisahkan fungsi panggilan dari fungsi yang dipanggil, yang berarti bahwa tumpukan panggilan Anda tidak terlalu membantu ketika debugging, tindakan perantara dapat menyebabkan sesuatu rusak yang biasanya berfungsi, hal-hal dapat gagal secara diam-diam ketika tidak dihubungkan dengan benar , dan seterusnya. Metode eksplisit "ambil komponen, dan panggil apa yang Anda butuhkan di atasnya" berfungsi dengan baik ketika menangkap kesalahan sejak dini dan memiliki kode yang jelas dan eksplisit. Itu hanya cenderung mengarah ke kode yang sangat erat dan banyak dependensi kompleks.
C # adalah bahasa yang hampir identik dengan Java. Apa pun yang Anda lakukan di Java dapat dilakukan dalam C #, hanya dengan sintaks yang berbeda. Jika Anda kesulitan menerjemahkan konsep, itu mungkin hanya karena Anda hanya tahu nama khusus Java untuknya.
sumber
Sudahkah Anda mencoba menggunakan kejadian statis sederhana? Misalnya, jika Anda ingin kelas skor Anda tahu tentang kapan musuh mati, Anda akan melakukan sesuatu seperti ini:
Score.cs
EnemySpaceship.cs
SpaceshipDeathEventArgs.cs
sumber
Jika Anda merasa tidak nyaman dengan pendekatan berbasis peristiwa, cobalah Artemis C #, ini adalah kerangka kerja Sistem Entitas yang didasarkan pada http://t-machine.org/index.php/2007/09/03/entity-systems-are -the-future-of-mmog-development-part-1 /
Sumber: https://github.com/thelinuxlich/artemis_CSharp Contoh permainan: https://github.com/thelinuxlich/starwarrior_CSharp
sumber
coba gunakan agregator acara seperti ini
sumber