Ich entwickle ein Spiel mit XNA und habe Probleme mit Auflösungen. Im Moment habe ich nur das Hauptmenü implementiert, aber ich möchte ein Spiel machen, das unabhängig von der Auflösung ist. Da ich ein Anfänger bin, habe ich die Auflösung bisher nicht berücksichtigt. Als ich die Auflösung änderte, bekam ich echte Kopfschmerzen. Das Hintergrundbild, das ich verwende, hat eine Auflösung von 1920 x 1080, also ein Seitenverhältnis von 16: 9. Die anfängliche Auflösung betrug 800 x 600, sodass das Hintergrundbild gestreckt aussieht. Gleiches gilt für Auflösungen mit einem Seitenverhältnis von 4: 3 (z. B. 640 x 480, 1024 x 768 usw.).
Bevor ich diese Frage stellte, suchte ich im Internet nach Informationen. Ich fand "XNA 2D Independent Resolution Rendering" und andere ähnliche Lösungen. Die angebotene Lösung scheint mir zunächst perfekt zu sein, da ich nicht daran gedacht habe, zwei Auflösungen zu verwenden. eine interne zum Zeichnen und eine, die der Größe des Fensters entspricht. Ich habe jedoch einige Probleme beobachtet.
Wenn ich den Vollbildmodus aktiviere und die Auflösung niedriger als die Desktopauflösung ist, wird die Auflösung des Spiels nicht auf den gesamten Bildschirm ausgedehnt. Dadurch wird das Spiel in der Mitte des Bildschirms gezeichnet, jedoch mit einem schwarzen Rand auf beiden Seiten des Bildschirms.
Das Seitenverhältnis meines Hintergrundbilds beträgt 16: 9. Die von mir versuchten Auflösungen haben jedoch ein Seitenverhältnis von 4: 3. Mit der Seitenlösung habe ich das gleiche Problem; Das Hintergrundbild scheint gestreckt zu sein. Ich habe den Code recherchiert, um eine Lösung zu finden, und die RecreateScaleMatrix()
Funktion folgendermaßen geändert :
private static void RecreateScaleMatrix()
{
_dirtyMatrix = false;
float aspect = 16.0f / 9.0f;
_scaleMatrix =
Matrix.CreateScale((float)_device.GraphicsDevice.Viewport.Width / _virtualWidth,
(float)_device.GraphicsDevice.Viewport.Height / _virtualHeight, 1f) *
Matrix.CreateScale(1, EngineManager.GameGraphicsDevice.Viewport.AspectRatio /
aspect, 1) * Matrix.CreateTranslation(0, (_device.GraphicsDevice.Viewport.Height -
(_device.GraphicsDevice.Viewport.Height / aspect)) / 4.0f, 0);
}
Dies scheint das Problem gelöst zu haben, jedoch nur bei bestimmten Auflösungen, und das Rechteck, das das Endergebnis anzeigt, weiter zu reduzieren.
Ich habe den ganzen Tag über diese Probleme nachgedacht und festgestellt, dass es fast unmöglich ist, ein Bild klar zu zeichnen, ohne die genaue Auflösung des zu zeichnenden Bildes im Voraus (unabhängig vom Seitenverhältnis) zu kennen.
Wie löse ich meine Auflösungsprobleme?