2D XNA ゲームでスプライトを効率的に描画する方法は何ですか? より具体的にするために、この質問を 4 つの質問に分割しました。
以前は、Game1 の spriteBatch staticを宣言し、everyでSpriteBatch.Begin
andを呼び出していました。それはうまくいきませんでした。各ドローアブルに独自の SpriteBatch を与えることもうまくいきませんでした。.Close
IDrawable.Draw
Q1 : SpriteBatch インスタンスを1 つ持ち、begin/closeを 1 回だけ呼び出すのが最善だと思います。これは正しいです?
現在、私のGame1.Draw
見た目は次のようになっています。
spriteBatch.Begin();
base.Draw(gameTime); // draws elements of Game.Components
// ...
spriteBatch.End();
Q2 : このように、Begin
一度だけ呼び出されます。これは行く方法ですか?皆さんはこれをどのように解決しましたか?
Q3 : また、すべてのコンポーネントには独自のIGameComponent.LoadContent
メソッドがあります。そこにコンテンツをロードする必要がありますか? それとも、 などの親クラスでコンテンツをロードする方がよいGame1.LoadContent
でしょうか?
同じコンテンツを 2 回ロードしてはならないことに気付いたので、ドローアブル コンポーネントに static と non-static の両方を指定Texture2D
し、2 つのコンストラクターを指定しました。
static Texture2D defaultTexture;
public Texture2D MyTexture;
public Enemy()
: this(defaultTexture) { }
public Enemy(Texture2D texture)
{
MyTexture = texture;
}
protected override void LoadContent()
{
if (MyTexture == null)
{
if (defaultTexture == null)
{
defaultTexture = Content.Load<Texture2D>("enemy");
}
MyTexture = defaultTexture;
}
}
LoadContent
このように、クラスのデフォルト テクスチャは、そのクラスで最初に呼び出されたときにのみロードされます。ただし、texture
コンストラクターでパラメーターを指定する場合は、そのテクスチャーを事前にロードする必要があります。
Q4 : もっと良い方法があると思います。アセット名を文字列としてテクスチャ ディクショナリを作成することを考えています。何を提案しますか?