Bagaimana cara mengakses variabel di kelas Game1 dari kelas lain di XNA?

8

Saya mencoba menulis SpriteManagerkelas di XNA, tetapi saya perlu akses ke Gamevariabel. Misalnya, Game.Contentproperti akan sangat membantu dalam memuat tekstur, dan Game.GraphicsDevice.Viewportakan sangat membantu dalam mendapatkan ukuran jendela.

Untuk saat ini, saya memiliki kelas berikut:

public MainGame : DrawableGameComponent
{
    public SpriteManager<Enemy> EnemyManager { get; get; }
    public SpriteManager<Powerup> PowerupManager { get; set; }
    ...
}

Saya dapat memikirkan tiga cara untuk mendapatkan akses ke variabel-variabel ini di SpriteManagerkelas:

  1. Buat kelas manajer sprite saya berasal GameComponent. Ini akan ideal, kecuali bahwa sprite manager saya digunakan MainGame, yaitu a GameComponent.

  2. Gunakan ((Game) Game1)untuk mengakses variabel. Namun, melakukan pemeran seperti ini jelek dan merusak enkapsulasi.

  3. Catat semuanya dari MainGame. Misalnya, EnemyManagerperlu untuk memuat musuh acak ketik setiap kali memunculkan musuh, jadi bukan memuat tekstur di MainGame, lulus EnemyManagerpada Game.Contentproperti dan biarkan menangani tekstur pemuatan. Namun, saya tidak yakin apakah ini cara terbaik untuk menangani situasi ini. Saya tidak bisa meletakkan jari saya di atasnya, tetapi sepertinya 'salah' dalam beberapa hal.

Saya bisa menggunakan beberapa saran tentang cara terbaik untuk mencapai ini.

Daniel T.
sumber

Jawaban:

3

Jangan lakukan itu - jadikan sprite manager sebagai layanan .

BlueRaja - Danny Pflughoeft
sumber
Terima kasih, ini adalah yang pertama saya dengar tentang layanan game. Itu terlihat mirip dengan injeksi ketergantungan, tapi saya hanya sedikit terbiasa dengannya.
Daniel T.
@Aniel: Ketergantungan injeksi dan wadah layanan adalah dua jenis Pembalikan Kontrol . Lihat jawaban ini untuk lebih jelasnya.
BlueRaja - Danny Pflughoeft
1
Semua orang begitu cepat menjadikannya layanan game. Tidak terlalu buruk untuk mempublikasikannya. Anda hanya memiliki 1 instance game ..
Setheron
2

Sebenarnya # 2 tidak begitu buruk (saya akan berasumsi Anda bermaksud down-cast dari Gameke Game1). Anda bisa memberlakukan tipe yang ada Game1di konstruktor Anda seperti:

public MainGame : DrawableGameComponent
{
    public MainGame(Game1 game) : base(game) { }
}

Anda bahkan bisa membuat properti yang nyaman seperti ini. Itu akan selalu aman, asalkan yang mendasarinya DrawableGameComponenttidak melakukan apa pun tanpa dokumen.

public Game1 Game1 { get { return (Game1)Game; } }

Atau jika Anda ingin menjadi sangat anal tentang tidak casting (dan benar-benar tidak perlu ), Anda bisa melakukan ini:

public MainGame : DrawableGameComponent
{
    public MainGame(Game1 game) : base(game) { this.Game1 = game; }

    public Game1 Game1 { get; private set; }
}
Andrew Russell
sumber