Каков эффективный способ рисования спрайтов в моей 2D-игре XNA? Чтобы быть более конкретным, я разделил этот вопрос на 4 вопроса.
Я использовал объявление Game1 spriteBatch static и называл SpriteBatch.Begin
и .Close
в каждом IDrawable.Draw
. Это не сработало. Предоставление каждому из своих собственных SpriteBatch тоже не получилось.
Q1. Я полагаю, что лучше всего иметь один экземпляр SpriteBatch и только вызывать begin/close один раз. Правильно ли это?
В настоящее время мой Game1.Draw
выглядит примерно так:
spriteBatch.Begin();
base.Draw(gameTime); // draws elements of Game.Components
// ...
spriteBatch.End();
Q2: Таким образом, Begin
вызывается только один раз. Это путь? Как вы, ребята, решили это?
Q3. Кроме того, каждый компонент имеет собственный метод IGameComponent.LoadContent
. Должен ли я загружать там свой контент? Или лучше загружать контент в родительский класс, например Game1.LoadContent
?
Я понимаю, что я никогда не должен дважды загружать один и тот же контент, поэтому я предоставил свои извлекаемые компоненты как статические, так и нестатические 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: Я думаю, что должны быть лучшие способы сделать это. Я думаю о создании словаря текстур с именами их активов как строки. Что бы вы предложили?