[XNA] Anfängerfrage zu Sprites, SpriteFonts und GraphicDevice

11/01/2009 - 18:01 von Andreas Haberl | Report spam
Hallo,

ich mache meine ersten Schritte mit dem Visual Studio 2008 Express C# und
XNA 3.0.
Zum Lernen hab ich mir von XNAprojects.net den Quellcode von XNATetris
runtergeladen. Darin gibt es eine Klasse SpriteHelper, die sich um das
Verwalten und Zeichnen von Sprites kümmert. Ich habe versucht, diese Klasse
in einem eigenen Projekt zu verwenden und an meine Bedürfnisse anzupassen.

Als erstes habe ich diese Klasse erweitert, so dass auch SpriteFonts
verwaltet werden können. Das funktioniert soweit alles, wie ich es mir
vorstelle, bis auf einen Schönheitsfehler:

In der statischen Methode SpriteHelper.DrawSprites() wird das SpriteBatch
instanziiert. Um dem Konstruktor das entsprechende GraphicsDevice
mitzugeben, versucht die Methode dieses aus dem ersten Sprite in seiner
Liste zu extrahieren (sprite[0].texture.GraphicsDevice).

public static void DrawSprites( int width, int height)
{
[...]
// Create sprite batch if we have not done it yet.
// Use device from texture to create the sprite batch.
if (spriteBatch == null)
{
spriteBatch = new
SpriteBatch(sprites[0].texture.GraphicsDevice);
}
[...]
}

Das funktioniert natürlich nur, wenn das erste Element der Liste sprites
wirklich ein Sprite ist. Ist das erste Element ein FontSprite dann
funktioniert das nicht. Das kann man natürlich abfangen, aber irgendwie
finde ich nicht heraus, wie ich vom FontSprite das zugeordnete
GraphicsDevice ermitteln kann.

Was ich an der Stelle ohnehin nicht wirklich verstehe, warum es nicht
klappt, das spriteBatch einfach mit
spriteBatch = new SpriteBatch(GraphicsDevice);
zu erstellen. Der Versuch produziert die Fehlermeldung:
"Microsoft.Xna.Framework.Graphics.GraphicsDevice" ist ein(e) "Typ", wird
aber wie ein(e) "Variable" verwendet.

Wenn mir hier jemand auf die Sprünge helfen könnte?

anderl
 

Lesen sie die antworten

#1 Frank Dzaebel
11/01/2009 - 19:59 | Warnen spam
Hallo Andreas,

spriteBatch = new SpriteBatch( [...]

Was ich an der Stelle ohnehin nicht wirklich verstehe, warum es nicht
klappt, das spriteBatch einfach mit
spriteBatch = new SpriteBatch(GraphicsDevice);
zu erstellen. Der Versuch produziert die Fehlermeldung:
"Microsoft.Xna.Framework.Graphics.GraphicsDevice" ist ein(e) "Typ",
wird aber wie ein(e) "Variable" verwendet.
Wenn mir hier jemand auf die Sprünge helfen könnte?



Der Konstruktor der Klasse SpriteBatch benötigt
im (ersten) Parameter eine *Instanz* des Typs
GraphicsDevice. Wenn Du:
spriteBatch = new SpriteBatch(GraphicsDevice);
im Code benutzt, ist GraphicsDevice ja eine Klasse (ein "Typ")
und keine Instanz:

[GraphicsDevice Class]
http://msdn.microsoft.com/en-us/lib...evice.aspx

Anstatt eine Instanz schreibst Du diesen Typ also als
Parameter so, als wenn er eine Variable wàre.
Das geht nicht, es muss eine Instanz, also hier eine
Variable des Typs GraphicsDevice sein.


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen