まず第一に、私は 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
。何か案は?