1

まず第一に、私は C# と XNA (C++ の前) が初めてです。

Web の半分と、おそらくスタックオーバーフロー全体を検索しましたが、答えが見つかりませんでした。私のプロジェクトでは、GraphicsManager を作成したいと考えていました。その仕事は、オープン ワールド ゲームのリソースのロード/アンロード、より抽象的なレンダリング ツールの提供 (タイルセットのロード、タイルセットからのタイルの選択など) などです。

そのため、すべてのグラフィック関連オブジェクトを GraphicsManager に配置するのが自然だと感じました。

class GraphicsManager : Manager
{
    // provided by XNA project
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;

    public override void Initialize(Game caller)
    {
        mainObj = caller;
        graphics = new GraphicsDeviceManager(mainObj);
    }
}

// constructor of the Game class
public Game()
{     
    Graphics.GraphicsManager.Instance.Initialize(this);
    Content.RootDirectory = "Content";
}

しばらくして、Initialize() の前に GraphicsDeviceManager を作成する必要があることを発見しました。これは、LoadContent() を強制的に呼び出すためです。GraphicsDeviceManager のコンストラクターは、提供された Game オブジェクトに対していくつかの操作を実行して、その Initialize() を変更します。メソッド(または類似のもの)。

そのため、コードを変更して、Game のコンストラクターで GraphicManager の Initialize() を実行するようにしました。残念ながら、この方法では LoadContent() は呼び出されません。なんで?

PS。クラスで任意の GraphicsDeviceManager オブジェクトを宣言するだけで十分です。インスタンス化する必要はありません。そうすれば機能します。それは私には意味がありません:/

@Scott WGameコンストラクターを削除し、クラスの名前を(にGame1)変更し、このメソッドを作成しました:

protected override void Initialize()
    {
        // TODO: Add your initialization logic here
        Graphics.GraphicsManager.Instance.Initialize(this);

        Content.RootDirectory = "Content";

        base.Initialize();
    }

しかし、今は呼び出されませんLoadContent。何か案は?

4

1 に答える 1