Wie sollten sich NPCs und Kacheln in einem auf 2D-Kacheln basierenden Spiel aufeinander beziehen?

9

Ich mache eine Kachel-Engine für Top-Down-2D-Spiele. Grundsätzlich besteht die Welt aus einem Gitter von Kacheln.

Jetzt möchte ich zum Beispiel NPCs setzen, die sich auf der Karte bewegen können.

Was denkst du ist am besten:

  1. Jede Kachel hat einen Zeiger auf den NPC, der sich auf ihrer Kachel befindet, oder einen NULL-Zeiger
  2. eine Liste von NPCs haben und sie haben die Koordinaten der Kachel, auf der sie sich befinden.
  3. etwas anderes?

Meiner Ansicht nach

  1. ist schneller für die Kollisionserkennung, würde aber viel mehr Speicherplatz verbrauchen und es ist langsamer, alle NPCs in einer Karte zu finden.
  2. ist das Gegenteil.
Lezebulon
quelle

Antworten:

11

Warum nicht beide? Es gibt Zeiten, in denen Sie nachsehen möchten, ob sich auf einer bestimmten Kachel ein NPC befindet (z. B. zur Kollisionserkennung, wie Sie bereits erwähnt haben), und manchmal möchten Sie alle NPCs der Welt durchlaufen ( B. um ihre KI-Methoden in jedem Frame auszuführen).

Ein Zeiger pro Kachel ist nicht so viel Speicher, es sei denn, Sie arbeiten auf einer Plattform mit eingeschränktem Speicher oder Sie haben eine wirklich große Karte.

Nathan Reed
quelle
5
+1 Ich stimme dem eher zu, aber @lezebulon, ich schlage vor, dass Sie jede Logik, die beide zusammen aktualisieren muss, so früh wie möglich zusammenfassen. Das heißt, wenn ein Spieler ein Plättchen verlässt, sollte es eine atomare Operation (Funktionsaufruf) geben, um beide Zeiger, Spieler-zu-Plättchen und Plättchen-zu-Spieler, gleichzeitig zu entfernen. Und das Gleiche gilt, wenn ein Spieler auf einem Plättchen ankommt, die beiden Zeigerzuweisungen zusammen durchzuführen. Dies erspart Ihnen ein potenzielles Chaos, in dem Referenzen nicht miteinander übereinstimmen, dh eine existiert, während die andere nicht existiert.
Ingenieur
0

Wie gehen Sie mit Kollisionen mit der Karte um? Wenn Sie eine Kollisionsebene haben, besteht eine sehr einfache Möglichkeit darin, zuerst eine Liste von NPCs mit Koordinaten zu erstellen, die angeben, auf welcher Kachel sie sich befinden, diese Liste dann zu durchlaufen und die Kachel der Kollisionsebene unter dem NPC als Kollisionskachel zu markieren. Auf diese Weise würden die Kollisionen gegen NPCs gleichzeitig mit dem Rest der Karte behandelt. Das heißt natürlich, wenn sich die NPCs nicht bewegen ...

Joona
quelle