Was ist in einem auf 2D-Kacheln basierenden Spiel eine gute Methode zum Scrollen?


9

Ich verwende Direct3D mit dem D3DXSPRITE-Wrapper, um die Kacheln auf den Bildschirm zu zeichnen. Ich habe eine Kachelklasse, die Elemente wie Kollision und Kacheltyp enthält, dann habe ich eine Reihe von Kacheln, z

Fliesenraster [256] [256];

Welches wäre eine bessere Methode?

- Zeichnen Sie den Player in die Mitte des Bildschirms und versetzen Sie ihn dort, wo die Karte zeichnet.

- Bewegen Sie den Player mit der folgenden Kamera.

Ich habe die erste Methode verwendet, aber sie wird sehr kompliziert, wenn Sie am oberen linken Rand der Karte ankommen und wenn andere Spieler / Feinde auf der Karte sind und sich gleichzeitig bewegen

Wenn ich die Kamera dem Player folgen lasse, müsste ich dann für jede einzelne Gitterkachel spriteBatch-> Draw (...) aufrufen, obwohl nur wenige auf den Bildschirm passen?

Antworten:


4

Es ist wahrscheinlich am besten, alle Aktualisierungen und Berechnungen in "realen" Einheiten der Welt durchzuführen und die Kamera zu bewegen. Ihr spriteBatch führt möglicherweise selbst ein Culling durch. Wenn es jedoch zu langsam ist, können Sie versuchen, festzustellen, welche Kacheln auf dem Bildschirm angezeigt werden müssen, und nur diese zeichnen.


Sie werden wahrscheinlich Code schreiben wollen, um nur die sichtbaren Sprites zu zeichnen, insbesondere wenn Sie feststellen, dass Sie die Größe Ihres Rasters erhöhen müssen.

2

Das Bewegen der Kamera in Weltkoordinaten und das Bewegen Ihres Charakters um die Welt ist der einfachste Weg, um dieses Problem anzugehen. Wenn Sie in Weltkoordinaten arbeiten, müssen Sie keine zusätzlichen Berechnungen durchführen, wenn es auf alle anderen Systeme ankommt, die auf einem arbeiten müssen relative Koordinaten System und verstehen auch, wo sie in Weltkoordinaten sind.

Da Sie in 2D arbeiten, besteht ein weiterer guter Tipp darin, eine räumliche Partitionierung durchzuführen. Am einfachsten wäre es, ein Rastersystem für die virtuelle Welt zu erstellen. Auf diese Weise können Sie jede Kachel einzeln verwalten, indem Sie Sprites und andere Ressourcen pro Kachel zuordnen im Wesentlichen wäre der Prozess:

  • Erstellen Sie eine Kachelklasse, die die Grenzkoordinaten für die Kachel und alle Ressourcen enthalten kann, die für eine bestimmte Kachel erforderlich sind (Sprites, Feinde usw.).

  • Entscheiden Sie sich für die Größe Ihrer Welt und erstellen Sie ein 2D-Array (Sie können eine Dimension verwenden und als 2D darauf zugreifen) mit Kacheln, die jeweils einen Teil Ihrer Welt mit allen zugehörigen Ressourcen darstellen.

  • Ziehe nur Ressourcen von dem Plättchen, auf dem sich der Spieler befindet, und seinen Nachbarn.

Mit einem Raster können Sie anhand der Position relativ zum Start des Rasters leicht herausfinden, auf welchem ​​Plättchen sich der Spieler befindet.

Um das von Ihnen erwähnte Problem mit der Kamera zu umgehen, müssen Sie den Player und die Kamera zu zwei unabhängigen Systemen machen, bei denen die Kamera nicht weiter als bis zur Mitte der Randkacheln fährt. Wenn der Spieler zu dieser Kachel fährt, kann er sich dennoch durch die Kamera bewegen Die gesamte Kachel ist an Weltkoordinaten gebunden (dh nicht mehr auf dem Bildschirm zentriert), aber die Kamera ist gesperrt.


0

Ich benutze eine Oberfläche. Ich erschaffe die ganze Welt auf einer Off-Screen-Oberfläche und behalte eine x- und y-Koordinate. Ich ändere diese, wenn sich der Spieler bewegt und jeder Frame mit x und y ein Rechteck von 1028 x 768 von der Oberfläche zum Backbuffer zeichnet.

Was andere Menschen betrifft, gebe ich ihnen ein x und y und lasse sie sich nach Belieben um die Welt bewegen. Beim Zeichnen überprüfe ich, ob x und y im Rechteck 1028 x 768 sind, und wenn ja, zeichne ich sie (ich verwende Texturen für Menschen). .

Ich habe den Player in der Mitte des Bildschirms und überprüfe, ob der Rand der Welt den Rand des Bildschirms erreicht hat. Unter diesen Umständen bewegt sich der Spieler über den Bildschirm zum Rand der Welt und zurück in die Mitte, dann beginnt sich die Welt wieder zu bewegen. es scheint schwer und hat eine Weile gedauert, ist aber nicht schlecht zu tun.

Ich verwende 64 x 64 Kacheln und die größte Welt, die ich bisher verwendet habe, sind 50 x 60 Kacheln.

Dies geschieht alles in direktem x mit c ++


1
Dies scheint ein RIESIGES Gedächtnisfresser zu sein. Wenn Sie die gesamte Welt außerhalb des Bildschirms zeichnen, treten Probleme mit dem Speicher auf, sobald Sie beispielsweise mehrere (animierte) Ebenen für Ihre Welt haben und diese weiter ausbauen möchten als bisher. Es wäre viel besser, die Informationen über die Welt zu behalten und nur die Teile / Objekte zu zeichnen, die gezeichnet werden müssen, wenn sie gezeichnet werden müssen. Nur meine 2 Cent. :)
Richard Marskell - Drackir

@ Drakeir Ich denke du missverstehst. Nur die Welt wird vom Bildschirm gezeichnet, Dinge wie die anderen Personen werden verfolgt und in den Backer-Puffer gezeichnet, wenn sie benötigt werden. Ich sehe mich auch nicht in der 70 x 70 Welt. Wenn ich Welt sage, meine ich Gebiet, könnte dies eine Stadt sein, ein Verlies oder das Innere eines Hauses. Wenn sich der Spieler zwischen ihnen bewegt, wird die Off-Screen-Oberfläche rekonstruiert. Ja, es braucht Speicherplatz, aber 2D-Kacheln auf modernen Terrabite-Laufwerken machen es vernachlässigbar und ein paar Sekunden Laden ist ein kleiner Preis für reibungsloses Scrollen und Animieren. aber ja, es gibt bessere und schwierigere Wege :)
Skeith

Die Oberfläche sollte im GFX-Kartenspeicher und nicht auf der Festplatte gespeichert werden. Ich glaube jedoch, wenn der GFX-Kartenspeicher zu groß ist, werden die Oberflächen auf die Festplatte verschoben, was die Dinge erheblich verlangsamen würde. Zugegeben, es ist schon eine Weile her, dass ich mich mit diesem Zeug befasst habe, also erinnere ich mich nicht genau, wie es funktioniert hat, aber ich denke, solange du nicht zu groß von einer Welt zeichnest, wäre es in Ordnung. :)
Richard Marskell - Drackir

@Drackir Das ist interessant zu wissen, ich habe nie so darüber nachgedacht. Ich fand, dass dieser Weg mir eine glattere Schriftrolle gibt, die, wenn ich dynamisch neue Kacheln zeichnete, so dass ich denke, dass es in Ordnung passt, aber ich muss mich darum kümmern.
Skeith

Ich habe an einem Spiel gearbeitet, bei dem ich Karten 31x31 hatte, die aber nebeneinander angebracht waren. Ich habe versucht, mit der Engine eines anderen zu arbeiten, und er hat alle Karten gezeichnet, die die Karte umgeben, auf der sich der Spieler befand. also insgesamt neun Karten. Jede Karte hatte mehrere (ich denke 6) Ebenen. So wie 31x31x9x6 = 51894 Kacheln gezeichnet werden (natürlich natürlich; nicht alle Kacheln waren voll), wenn der Benutzer die Karte wechselt. Das war eine enorme Verlangsamung für mich, daher habe ich die Zeichenroutine neu geschrieben, um die den Spieler umgebenden Kacheln nur bis zu 1 Kachel hinter dem Bildschirmrand zu zeichnen (um Teilkacheln während der Bewegung zu handhaben).
Richard Marskell - Drackir

0

Es ist ganz normal, dass der Code in den Ecken einer gekachelten Welt ein wenig Schmerzen bekommt, wenn er herausfindet, welche Tiels gezeichnet werden sollen, und gleichzeitig sicherstellt, dass die Kamera nicht aus der Welt gerät. Diese Randfälle sind im Grunde genommen die zwingendste Sache bei der Implementierung einer 2D-Kachel-basierten Welt, die größer ist als die Bildschirmauflösung. Es wird viel komplexer, wenn Sie das Vergrößern und das Zoomen auf den Cursor unterstützen: D.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.