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