Was ist der praktischste Weg, um Kamera / Ansichtsfenster in ein 2D-Spiel zu implementieren?
Ich habe gelesen, dass ich das Objekt speichern soll Weltposition statt Position relativ zum Bildschirm?
Momentane Situation:
Ich habe ein einfaches 2D-Spiel implementiert, in dem ich Objekte und Ebenen aus XML-Dateien lade. Derzeit sieht die Level-XML-Datei so aus:
<map>
<tile obj="ground" x="0" y="555" />
<tile obj="ground" x="16" y="555" />
<tile obj="ground" x="32" y="555" />
...
</map>
Alle Objekte haben eine 2D-Vektor- "Position", in der ihre aktuelle Position auf dem Bildschirm gespeichert ist.
Was ich mir wünsche:
In dem Bild:
- Die Kamera ist entweder 800x600 oder 640x480
- Blöcke und Sprites haben eine Größe von 16 x 16 Pixel.
- Weltgröße kann variieren
- Die Koordinaten sollten wahrscheinlich relativ zur Welt normalisiert werden, nicht zum Bildschirm?
- Position des Ansichtsfensters relativ zu x, y und des Players, wenn der Player die Totzone der Kamera erreicht (ähnlich wie in diesem Video ).
Ich frage nach Pseudobeispielen / Artikeln, aber wenn Sie wissen möchten, was ich für die Entwicklung verwende: SDL & C / C ++.
c++
2d
architecture
camera
bluekirai
quelle
quelle
Antworten:
Sie müssen jedes Objekt relativ zur Welt anstelle des Bildschirms positionieren. Ihre Kamera sollte auch eigene Weltkoordinaten haben, damit sie an einer relativen Position in der Welt gezeichnet werden kann. Es kann auch praktisch sein, Ihre Kamera einem Objekt folgen zu lassen. Wo immer sich das Objekt befindet, verwendet die Kamera nur ihre Koordinaten. In der Regel werden die Koordinaten der Kamera von der oberen linken Ecke aus positioniert. Dies bedeutet, dass die Kamera eine Weltposition von ungefähr (0,24) im Bild haben würde .
Um die Objekte zu zeichnen, die die Kamera "sehen" kann, müssen Sie alle Objekte relativ zu den Weltkoordinaten der Kamera zeichnen. Gehen Sie wie folgt vor, um die Bildschirmposition eines Objekts relativ zur Kamera zu berechnen:
Offensichtlich sind einige Objekte für die Kamera nicht sichtbar. Daher möchten Sie möglicherweise ein System zum Auslesen von Ansichten implementieren.
quelle
All dies tun Sie am besten in der GPU mit den Matrizen World und View, nicht indem Sie ändern, wo Sie die Objekte auf der CPU zeichnen.
Auf diese Weise können Sie die Kamera beliebig ändern (sogar vergrößern und verkleinern!) Und sie funktioniert auf magische Weise. Sie können weiterhin auch das Anzeigen von Auswertungen durchführen, um Zeichenzeit zu sparen. Und keiner Ihrer Codes zum Zeichnen der Welt muss sich ändern, nachdem Sie die Ansicht und die Weltmatrizen korrekt eingerichtet haben.
In SDL können Sie OpenGL-Aufrufe wie
glOrtho
und wahrscheinlich nur inline ausführenglTranslate
.Siehe diesen Thread .
quelle