Che cos'è un modo efficiente per disegnare sprite nel mio gioco 2D XNA? Per essere più concreto, ho suddiviso questa domanda in 4 domande.Best practice: disegno efficiente dello sprite in XNA
ho usato per dichiarare di Game1 SpriteBatch statica, e chiamò SpriteBatch.Begin
e .Close
in ogni IDrawable.Draw
. Non ha funzionato bene Inoltre, dare a ciascun drawable il proprio SpriteBatch non ha funzionato bene.
Q1: Penso che sia meglio avere un esempio SpriteBatch, e solo chiamo iniziare/vicino volta. È corretto?
Attualmente, il mio Game1.Draw
sembra qualcosa di simile:
spriteBatch.Begin();
base.Draw(gameTime); // draws elements of Game.Components
// ...
spriteBatch.End();
Q2: In questo modo, Begin
viene chiamato solo una volta. È questa la strada da percorrere? Come avete risolto questo problema?
Q3: Inoltre, ogni componente ha il proprio metodo di IGameComponent.LoadContent
. Dovrei caricare i miei contenuti lì? O è meglio caricare il contenuto in una classe genitore, come ad esempio Game1.LoadContent
?
mi rendo conto che non avrei mai caricare lo stesso contenuto due volte, quindi mi hanno dato i miei componenti disegnabili sia statica e non statico Texture2D
, e li diede 2 costruttori:
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;
}
}
Questo In questo modo, le trame predefinite di una classe vengono caricate solo la prima volta che viene chiamata la classe LoadContent
. Tuttavia, quando il parametro texture
è specificato nella funzione di costruzione, dovrò prima caricare la trama.
Q4: Penso che ci dovrebbero essere modi migliori per farlo. Sto pensando di creare un dizionario di texture con i loro nomi di risorse come stringa. Che cosa suggeriresti?
lo faccio nel stessa strada. Se non ho motivo di usare il multiplo sprite batch (ad esempio per split-screen, effetti diversi, e così via), sto chiamando begin e end solo una volta nella classe principale del gioco, e disegno tutto tra questo inizio e fine. – Thaven