Implementieren einer Kamera / eines Ansichtsfensters in ein 2D-Spiel

20

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:

Ansichtsfenster / Gameworld Illustration

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 ++.

bluekirai
quelle
1
Fügen Sie hier Ihren dritten Link in die Kommentare ein, und ich kann ihn Ihrer Frage hinzufügen.
MichaelHouse
Folgendes habe
Hallo @Arthur Wulf White, möchtest du das näher erläutern? Vielen Dank.
Bluekirai
Die Kamera, die Sie erwähnen, ist eine bestimmte Version einer allgemeinen 2D-Kamera, die nur zum Versetzen der Ansicht verwendet wird (keine Drehung und kein Zoomen). Das Verfolgungsverhalten kann implementiert werden, indem der Abstand zwischen dem Spielercharakter und der Kamera überprüft und die Kamera bewegt wird, wenn der Abstand zu groß ist.
Wolfdawn

Antworten:

19

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:

int screenX, screenY; //screen position of the object being drawn

screenX = object.x-camera.x;
screenY = object.y-camera.y;

Offensichtlich sind einige Objekte für die Kamera nicht sichtbar. Daher möchten Sie möglicherweise ein System zum Auslesen von Ansichten implementieren.

Dan Watkins
quelle
2

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 glOrthound wahrscheinlich nur inline ausführen glTranslate.

Siehe diesen Thread .

mklingen
quelle
Kann jemand die Ablehnung erklären? Das macht Sinn.
Hallo Welt
1
Ich habe nicht abgestimmt, aber ich denke, es liegt daran, dass dies nicht einmal die Frage beantwortet. Die Frage ist, wie man etwas berechnet und nicht, ob es effizienter oder einfacher ist, auf einer GPU im Vergleich zur CPU zu arbeiten. Das OP sagte sogar, er suche nach Pseudobeispielen. Es besteht kein Zweifel, dass die Verwendung einer Kombination aus Kamera / Welt / Modell-Matrizen effizienter wäre, daher hat mklingen zumindest einen Punkt.
Dan Watkins
Diese Antwort ist überhaupt nicht schlecht! Es ist spezifischer für die OpenGL / DX-Entwicklung, aber der richtige Ansatz, da Sie einfach eine Übersetzungsmatrix basierend auf Kamerakooren berechnen und Objekte über eine Cam-Matrix verschieben können, ohne ihre tatsächliche Position zu ändern.
Nenchev