XNAの別のクラスからGame1クラスの変数にアクセスするにはどうすればよいですか?


8

SpriteManagerXNAでクラスを記述しようとしていますが、Game変数にアクセスする必要があります。たとえば、Game.Contentプロパティはテクスチャのロードに非常に役立ちGame.GraphicsDevice.Viewport、ウィンドウサイズを取得するのに役立ちます。

今のところ、私は次のクラスを持っています:

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

SpriteManagerクラスでこれらの変数にアクセスするには、3つの方法が考えられます。

  1. 私のスプライトマネージャークラスをから派生させGameComponentます。これは私のスプライトマネージャがで使用されていることを除いて、理想的ですMainGameGameComponent

  2. ((Game) Game1)変数にアクセスするために使用します。ただし、この種のキャストを行うことは醜く、カプセル化を壊します。

  3. からすべてを渡しますMainGame。たとえば、EnemyManagerは敵をスポーンするたびにランダムな敵タイプをロードする必要があるため、でテクスチャをロードする代わりに、プロパティをMainGame渡しEnemyManagerGame.Contentテクスチャのロードを処理させます。しかし、これが状況を処理する最良の方法であるかどうかはわかりません。指を置くことはできませんが、ある意味「間違っている」ように見えます。

これを達成するための最良の方法についていくつかのアドバイスを使用できます。

回答:


3

そうしないでください- 代わりにスプライトマネージャーをサービスにしてください。


ありがとう、これは私がゲームサービスについて聞いた最初のものです。依存関係の注入に似ていますが、私は少しだけ慣れています。
ダニエルT.

@Daniel:依存性注入とサービスコンテナーは、制御反転の 2つのタイプです。詳細については、この回答を参照してください。
BlueRaja-ダニープフルフフト

1
誰もがそれをゲームサービスにするのはとても速いです。それを公開することはそれほど悪いことではありません。ゲームインスタンスは1つしかありません..
Setheron

2

実際に#2は、(私はあなたからダウンキャストに意味を前提となりますので、悪くはないGameGame1)。次のGame1ように、コンストラクターにある型を強制できます。

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

このような便利なプロパティを作成することもできます。基礎となるDrawableGameComponentものが文書化されていないことを行わない限り、それは常に安全です。

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

または、キャストしないことについて非常にアナルになりたい場合は(実際に行う必要はありません)、これを行うことができます。

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

    public Game1 Game1 { get; private set; }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.