Come posso accedere alle variabili nella classe Game1 da un'altra classe in XNA?


8

Sto cercando di scrivere una SpriteManagerclasse in XNA, ma ho bisogno di accedere alle Gamevariabili. Ad esempio, la Game.Contentproprietà sarebbe molto utile nel caricamento delle trame e Game.GraphicsDevice.Viewportsarebbe utile per ottenere le dimensioni della finestra.

Per ora, ho la seguente classe:

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

Posso pensare a tre modi per ottenere l'accesso a queste variabili nella SpriteManagerclasse:

  1. Fai in modo che la mia classe manager sprite derivi GameComponent. Questo sarebbe l'ideale, tranne per il fatto che viene utilizzato il mio sprite manager MainGame, che è a GameComponent.

  2. Utilizzare ((Game) Game1)per accedere alle variabili. Tuttavia, fare questo tipo di cast è brutto e rompe l'incapsulamento.

  3. Passa tutto da MainGame. Ad esempio, EnemyManagerdeve caricare un tipo di nemico casuale ogni volta che genera un nemico, quindi invece di caricare le trame MainGame, passa EnemyManagerla Game.Contentproprietà e lascia che gestisca il caricamento delle trame. Tuttavia, non sono sicuro che questo sia il modo migliore di gestire la situazione. Non ci riesco, ma sembra in qualche modo "sbagliato".

Potrei usare alcuni consigli sul modo migliore per raggiungere questo obiettivo.

Risposte:


3

Grazie, questo è il primo che ho sentito parlare di servizi di gioco. Sembra simile all'iniezione di dipendenza, ma la conosco solo leggermente.
Daniel T.

@Daniel: l'iniezione delle dipendenze e i contenitori di servizio sono due tipi di Inversion of Control . Vedi questa risposta per maggiori dettagli.
BlueRaja - Danny Pflughoeft,

1
Tutti sono così veloci da renderlo un servizio di gioco. Non è poi così male renderlo pubblico. Hai solo 1 istanza di gioco ..
Setheron

2

In realtà il n. 2 non è poi così male (suppongo che avresti voluto eseguire il down-cast da Gamea Game1). Puoi applicare il tipo Game1nel tuo costruttore in questo modo:

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

Potresti persino creare una proprietà comoda come questa. Sarà sempre sicuro, a condizione che il sottostante DrawableGameComponentnon faccia nulla senza documenti.

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

O se vuoi essere estremamente anale nel non lanciare (e non c'è davvero bisogno di esserlo), potresti farlo:

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

    public Game1 Game1 { get; private set; }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.