Wie halte ich meinen Charakter auf dem Bildschirm zentriert?

8

Ich mache ein Spiel ähnlich Legend of Zelda: Link to the Past (2D-Action-Abenteuer von oben nach unten). Ich möchte, dass der Charakter auf dem Bildschirm zentriert bleibt, wenn er sich bewegt.

Derzeit bewege ich die gesamte Karte in die entgegengesetzte Richtung, wenn der Spieler sich bewegen möchte. Das funktioniert, aber wenn ich der Welt mehr Objekte hinzufüge, wird es komplizierter, sie alle zu bewegen.

Gibt es einen besseren Weg, dies zu erreichen?

asbumste
quelle
19
Erstellen Sie eine Kamera und verschieben Sie diese. Im Wesentlichen wird alles mit einem Versatz gezeichnet, der von der Kameraposition abhängt. Das Universum zu bewegen, um Ihren Charakter zu bewegen, ist ein wenig übertrieben, Professor Farnsworth.
MichaelHouse
1
+1 für die Referenzierung seiner Referenzierung seiner Futurama-Referenz: P
Türknauf
@ Byte56 Danke, das ist nah an dem, was ich tue, also könnte ich es einfach so lassen, wie es ist. Das macht aber sehr viel Sinn. Möchten Sie das in eine Antwort einfügen, damit ich es akzeptieren kann?
Asbumste
Welches Rendering-Subsystem verwenden Sie?
Bobobobo

Antworten:

8

Die typische Vorgehensweise besteht darin, ein Kameraobjekt zu erstellen. Die einfachste Form einer Kamera ist nur eine Position. Diese einfache Kamera definiert die "Mitte" der aktuellen Ansicht. Sie ändern also nicht alle Positionen Ihrer Kacheln / Objekte, sondern subtrahieren beim Zeichnen nur die Kamerakoordinaten von den Positionen. In dieser Situation "bewegt" sich die Kamera nicht.

Während die Kamera und Ihr Charakter die meiste Zeit eine Position teilen, möchten Sie sie möglicherweise dennoch als separate Werte haben, damit Sie beispielsweise die Kamera daran hindern können, sich zu bewegen, wenn sie das Ende der Welt erreicht, aber die zulassen Spieler, um sich weiter zu bewegen.

Eine etwas fortgeschrittenere Kamera bewegt sich. Alle Objekte und Kacheln werden ohne Versatz gezeichnet, und die Position, von der aus Sie rendern, ändert sich. Dies ist der grundlegendsten Kamera sehr ähnlich, und Sie können immer noch viele der gleichen Optimierungen für das selektive Rendern durchführen (nur das aufrufen, drawwas die Kamera sehen kann). Es ist im Wesentlichen nur eine andere Art, darüber nachzudenken.

MichaelHouse
quelle
Hallo Byte, ich habe das, was du gesagt hast, mit Erfolg umgesetzt ... denke ich. Aber jetzt stoße ich auf Probleme ... können Sie mir helfen, einen Blick darauf zu werfen? Einer sagte, ich brauche eigentlich keine cam variables... und bot eine alternative Methode an ... stackoverflow.com/questions/18199373/…
Growler
Ich werde es mir später ansehen, jetzt schlage ich vor, dass Sie im Chat danach fragen .
MichaelHouse
3

Nein, das ist der falsche Weg.

Wie werden Sie die Trap-Erkennung durchführen? Was ist, wenn der Spieler die Ränder der Wände erreicht? Funktioniert Ihr Anzeigesystem für Dungeons oder müssen Sie einen wesentlichen Teil des Codes neu schreiben?

Die Welt ist Geometrie. Der Spieler ist Geometrie. Die Welt bewegt sich nicht. Der Spieler tut es. Stellen Sie die Position der Kamera so ein, dass sie auf dem Player zentriert ist. Immer . Und das ist alles.

Versuchen Sie nicht und bekommen Lust mit „oh , wenn ich die Welt schieben, dann wird es das geben Aussehen der Spieler bewegt sich “. Sie werden die Mathematik am Ende des Tages nur mit seltsamen Koordinatensystemen komplizieren.

Es ist wahr, dass das Rendern von OpenGL tatsächlich funktioniert, indem "die Kamera so fixiert wird, dass sie nach unten zeigt - z, und die gesamte Weltgeometrie so transformiert und gedreht wird, dass sie in das Volumen der kanonischen Ansicht passt", aber Sie sollten beim Programmieren nicht so darüber nachdenken . gluLookAthat Parameter benannt eye, lookund das upaus einem Grund - so können Sie in einem vernünftigen Koordinatensystem denken.

Bobobobo
quelle
Einer der größten Fehler, den ich mit einem von mir entwickelten GL-UI-System gemacht habe, war der Versuch, in kanonischen Koordinaten ([-1,1]) zu arbeiten, "um es einfacher zu machen". Alle Bildschirmobjekte hatten Koordinaten in [-1,1]. Dies war ein großer Fehler. Ich habe ständig versucht, in diesem [-1,1] -Bereich zu denken, zwischen Pixeln und NDC zu konvertieren und zurück zu konvertieren. Als ich diese Idee, in NDC zu arbeiten, aufgab und nur in Pixel arbeitete und kurz vor dem Rendern in NDC konvertierte, wie Sie es sollten , gab es einen großen Unterschied darin, wie einfach es war, über das Positionieren von Elementen auf dem Bildschirm nachzudenken. Prozesseingabeereignisse usw.
Bobobobo