XNA/Tutorials/Eine einfache Kameraklasse
Inhaltsverzeichnis
Vorwort
Hallo und herzlich willkommen zu diesem kurzen XNA Tutorial, in dem ich kurz und knapp aber hoffentlich dennoch in der nötigen Ausführlichkeit erklären werde, wie man eine einfach Kameraklasse für 2D Spiele wie etwa RPGs o.ä. realisiert. Vorkenntnisse in C# sind dabei unbedingt erforderlich und auch bereits einige Kenntnisse in XNA wünschenswert.
Voraussetzungen
Voraussetzungen für dieses Tutorial sind grundlegende C# Kenntnisse, eine funktionsfähige Installation von MS Visual C# 2008 Express (oder vergleichbares) inklusive des .Net Frameworks 3.0 sowie XNA 3.0 oder 3.1. Sinn und zweck dieses Tutorials ist es lediglich aufzuzeigen, wie man eine einfache Kamera realisieren kann, weshalb ich auch nicht näher auf die Grundlagen der Programmierung mit C# und oder XNA eingehen werde. Ach und ein paar mathematische Kenntnisse in Sachen Vektoren und Matrizen wären auch ganz praktisch ^^. Solltet ihr mit den oben genannten Dingen nicht anfangen können, empfehle ich zumindest vorher einmal folgendes Tutorial zu lesen: Teil 1: Hello, World!
Wieso eine Kameraklasse?
Einige werden sich jetzt evtl. fragen wieso man für ein 2D Spiel überhaupt so etwas wie eine Kameraklasse benötigt. Natürlich ist eine solche Klasse kein Muss, kann einem aber die Arbeit wesentlich leichter machen und macht den Code insgesamt etwas übersichtlicher. Außerdem bietet XNA eine ideal Möglichkeit so etwas sehr einfach und dennoch sehr wirkungsvoll zu realisieren.
Die Klasse
Der Aufbau
Den Grundstein unserer Klasse wird ein einfacher Vektor2 legen. Ein Vector2 speichert dabei ähnlich wie ein „Point“ die Koordinaten in einem zweidimensionalen Raum. Im Gegensatz zum „Point“ können einem Vector2 neben Ganzzahlen (integer) aber auch Kommazahlen (float, double etc.) übergeben werden. Dieser Vektor wird dann mit Hilfe der von XNA mitgebrachten Klassen in eine Matrix umgewandelt, welche dann zum Zeichnen der Umgebung verwendet werden kann.
Der Code
Nun zunächst fangen wir damit an eine neue Klasse anzulegen und nennen sie...ähhmm...sagen wir einfach „Camera2D“. Danach erstellen wir eine Variable vom Typ Vector2 innerhalb unserer Klasse und nennen diese Position. Vergesst dabei nicht die nötigen Using-Statements über eurer Klasse einzufügen. Sprich:
using Microsoft.Xna.Framework;
und
using Microsoft.Xna.Framework.Graphics;
Soweit so gut. Bisher sollte unsere Klasse so aussehen:
public class Camera2D { // Position der Kamera. private Vector2 Position = Vector2.Zero; }
Um nun die Position unserer Kamera zu verändern erstellen wir uns eine Update-Methode, die wir praktischerweise „Update“ nennen und übergeben ihr als Parameter sowohl eine Variable vom Typ GameTime, als auch eine Variable vom Typ Vector2. Die GameTime Variable werden wir zwar innerhalb dieses Tutorials nicht verwenden, es ist aber ratsam sie jetzt schon einzubinden, da sie für spätere Erweiterungen der Kameraklasse durchaus nützlich sein wird.
Innerhalb der Methode werden wir die neue Position unserer Kamera setzen. Dabei ist jedoch zu beachten, dass wir die X- und Y-Koordinaten der an die Methode übergebenen Position vorher invertieren müssen. Das hängt mit der späteren Umrechnung des Vektors in eine Matrix und der Art und Weise wie die Matirx zum Zeichnen verwendet wird zusammen. Ich belasse es, was das angeht einfach mal bei dieser einfachen Erkläsung, da alles andere den Rahmen dieses Tutorials sprengen würde ;).
Unsere Methode sollte nun also folgendermaßen aussehen:
public void Update(GameTime gameTime, Vector2 position) { // Neue Position der Kamera berechnen. this.Position = new Vector2(-1 * position.X, -1 * position.Y); }
Als letzten Teil der Kameraklasse brauchen wir nun noch eine Methode, die unseren Vektor in eine Matrix umrechnet und uns diese zurückgibt. Diese Methode nennen wir am besten einfach mal „getMatrix“. Der Code für diese Methode sieht wie folgt aus:
public Matrix getMatrix() { // Position der Kamera in eine Matrix umrechnen. return Matrix.CreateTranslation(new Vector3(this.Position, 0)); }
So viel zu unserer Kameraklasse. Der gesamte Code der Klasse sollte jetzt so aussehen:
public class Camera2D { // Position der Kamera. private Vector2 Position = Vector2.Zero; public void Update(GameTime gameTime, Vector2 position) { // Neue Position der Kamera berechnen. this.Position = new Vector2(-1 * position.X, -1 * position.Y); } public Matrix getMatrix() { // Position der Kamera in eine Matrix umrechnen. return Matrix.CreateTranslation(new Vector3(this.Position, 0)); } }
Anwendung
Um die Klasse nun verwenden zu können müssen wir zunächst natürlich eine Instanz unserer Klasse erstellen. Dabei werde ich hier aber nur ganz kurz eingehen.
Also:
private Camera2D camera = new Camera2D();
Die Position der Kamera ändern ganz einfach indem wir die „Update“-Methode aufrufen und die nötigen Parameter übergeben. Dies sollte am besten in der aktuellen Update-Schleife unseres Spiels geschehen. Aber kommen wir nun zum wichtigsten, dem Zeichnen mithilfe unserer neuen Klasse. Dazu begeben wir uns in die Draw-Methode unseres Spiels und rufen die „Begin“-Methode unseres SpirteBatch-Objekt auf (dieses sollte in jedem Spiel standardmäßig erstellt werden). Wichtig ist hierbei, dass wir dieser „Begin“-Methode als vierten Parameter unsere Matrix übergeben. Der Methodenaufruf sollte etwa so aussehen:
this.spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None, this.camera.getMatrix()); // Code zum Zeichnen aller von der Kamera betroffenen Objekte hier. this.spriteBatch.End();
Abschließende Worte
Das war auch eigentlich. schon alles. War doch gar nicht so schwer oder?! ;) Natürlich lässt sich das ganze auch noch sehr ausweiten, man könnte beispielsweise auch Mapgröße, Geschwindigkeit, Zoom uvm. mit in die Kameraklasse einfließen lassen. Aber für den Augenblick sollte das erstmal reichen. Wer weiss vielleicht schreibe ich ja noch eine Erweiterung zu diesem Tutorial.
Vielen Dank an alle die dieses Tutorial gelesen haben und denen es etwas geholfen hat. ^^