Apa cara terbaik untuk mengakses bidang/properti kelas Game1 di xna?

Saya sedang membuat game xna dan akan ada banyak kelas yang mengontrol menggambar dan memperbarui dan semacamnya.

Kelas-kelas ini harus dapat mengakses instance kelas Game1 asli, sehingga mereka dapat mengontrol perangkat grafis, kumpulan sprite, dan sebagainya.

Masalahnya adalah saya akan memiliki jaringan kelas, kelas yang memanggil kelas lain, dan kelas di bagian paling bawah rantai masih harus dapat mengakses kelas Game1 untuk perangkat grafis dan semacamnya.

Apa cara terbaik untuk melakukan ini? Terus berikan Game1 sebagai parameter, atau apa?


person Thomas    schedule 02.08.2012    source sumber


Jawaban (2)


Jawaban yang "benar" dari perspektif rekayasa perangkat lunak/arsitektur adalah meneruskan sumber daya spesifik yang Anda perlukan sebagai parameter ke dalam metode Anda. Hal ini memberikan banyak keuntungan - mungkin keuntungan terbesarnya adalah memisahkan berbagai bagian kode Anda, sehingga memungkinkannya digunakan secara independen satu sama lain.

Sebagai contoh: Anda mungkin memiliki permainan Anda. Tapi kemudian Anda mungkin ingin mengambil kode yang sama dan membuat editor, atau pengujian unit, atau alat gila lainnya. Dalam banyak kasus, Anda bahkan mungkin tidak memiliki kelas Game. (Sebagai contoh nyata, video saya ini menunjukkan kepada Anda dua cara yang sangat berbeda menjalankan kode permainan yang sama - ini tidak akan mungkin terjadi tanpa pemisahan yang tepat.)

(Atas dasar ini, Anda mungkin harus menyebarkan hal-hal yang lebih spesifik daripada kelas yang berasal dari Game.)

Anda dapat melangkah lebih jauh, jika Anda memiliki persyaratan versi/ketergantungan yang cukup terbuka, dan meneruskan IServiceProvider (misalnya, inilah yang diteruskan XNA ke konstruktor ContentManager). Saya melakukan analisis mendetail tentang mengapa Anda melakukan ini dalam jawaban ini.

NAMUN

Anda tidak sedang menulis perpustakaan yang akan digunakan oleh pihak ketiga. Anda sedang menulis permainan. Satu-satunya orang yang akan menggunakan kode Anda adalah tim Anda sendiri - dan Anda memiliki akses ke kode sumber dan Anda dapat dengan bebas memodifikasinya.

Ini berarti Anda bebas mengambil beberapa jalan pintas.

Dalam praktiknya, biasanya boleh saja mengambil instance statis dari kelas game Anda, atau (dan ini adalah metode pilihan saya saat saya menyatukan sesuatu) properti statis dari kelas game Anda. Dan di XNA Anda tahu bahwa Anda hanya akan memiliki satu contoh kelas permainan dalam praktiknya.

Caranya cepat dan mudah. Dan juga cepat dan mudah untuk melakukannya nanti dan beralih melakukan sesuatu dengan cara yang "benar". Selama Anda siap menghadapinya. Kontrol versi yang baik dan penggunaan "Temukan Semua Referensi" di Visual Studio sangat membantu di sini.

Pada dasarnya: selama Anda memahami bahwa Anda mengambil jalan pintas, mengapa Anda mengambilnya, dan apa cara yang "benar" - maka boleh saja mengambil jalan pintas itu.

person Andrew Russell    schedule 02.08.2012

Mengapa tidak menyimpan referensi statis ke game1, dan semuanya merujuk ke sana?

person Brian Mains    schedule 02.08.2012
comment
Apakah Anda yakin itu cara terbaik? Pada dasarnya semua yang saya bangun akan didasarkan pada cara saya menangani masalah ini, jadi harus sangat benar... - person Thomas; 02.08.2012
comment
Meneruskannya sebagai parameter atau konstruktor di mana pun mungkin tidak diperlukan; referensi statis menyediakan lokasi sentral untuk mengakses ini. Ini belum tentu merupakan masalah khusus XNA, namun masalah serupa untuk semua jenis aplikasi. Pendapat saya, dan sebagai penafian, saya melihat pemrograman XNA, tetapi belum membuat game saya sendiri.... - person Brian Mains; 02.08.2012