Wie soll man mit Positionen in einer kachelbasierten Welt umgehen?

7

Ich habe ein einfaches Tower Defense-Spiel mit einer gekachelten Welt. Kriechen und Türme sind immer auf einem Plättchen.

Wie soll ich die Position von Creeps im Code darstellen? (Kennen Creeps ihre aktuelle Kachel und Position auf dieser Kachel oder sind sie sich ihrer absoluten Weltposition bewusst?)

Grundsätzlich suche ich nach Best Practices, Tipps zum Entwerfen von Mustern oder allgemeinen Einsichten darüber, wie man die Positionierung in einer kachelbasierten Welt verwaltet.

Vielen Dank.

pwny
quelle
Wie viele Charaktere erwarten Sie in geschäftigen Zeiten in diesem Spiel? Weniger als ein paar hundert oder Tausende oder Zehntausende? (Ich nehme an, "Creeps" und "Towers" sind Arten von Charakteren in Ihrer Welt, die sich von selbst bewegen können.)
Randolf Richardson
1
Auf jeden Fall weniger als ein paar hundert. Creeps bewegen Monster, Türme bewegen sich nicht und schießen auf die Creeps.
pwny
(+1, weil die Antwort jetzt klarer ist.) Für eine kleine Zahl wie diese können Sie einfach ihre Positionen mit einem Array im Speicher behalten. Der Vorteil des Arbeitsspeichers liegt in der Geschwindigkeit. Ihr Code für die Towers kann das Array problemlos nach Creeps durchsuchen und zielt dann nur auf diejenigen ab, die sich in Reichweite befinden.
Randolf Richardson
Hoffentlich schlagen die Leute verschiedene Methoden / Ansätze vor, damit Sie experimentieren können, um herauszufinden, was für Ihr Spiel am besten funktioniert. Es wäre hilfreich, ein wenig näher darauf einzugehen, was Sie unter Kacheln verstehen, da Sie angedeutet haben, dass Sie kachelspezifische Positionen sowie globale Weltpositionen haben. Diese Welt besteht aus "Kacheln", die eine Reihe von Positionen auf einer kleinen Kachel aufnehmen können Gitter?
Randolf Richardson
1
Mögliches Duplikat: Wie gehe ich mit der RPG-Bewegung von oben nach unten um? Nach dem Prinzip, dass zwei Fragen, die genau die gleiche (richtige) Antwort erhalten können, wahrscheinlich ein Duplikat sind. Insbesondere denke ich, dass meine Antwort aus diesem Thread auch diese Frage beantworten könnte.
Doppelgreener

Antworten:

6

Nach meiner Erfahrung besteht der beste Weg, mit Positionen in einer kachelbasierten Welt umzugehen, darin, zu ignorieren, dass Sie sich in einer kachelbasierten Welt befinden. Das heißt, halten Sie Ihre Entitäten in Weltpositionen gespeichert, bewahren Sie die Pfade, auf denen Ihre Entitäten unterwegs sind, im Weltraum auf und lassen Sie Ihre Entitäten oder andere Spielelogiken, wenn möglich, nichts über Kacheln wissen überhaupt.

Das Problem bei der Berücksichtigung von Kacheln besteht darin, dass sie Eckfälle in Ihren Spielcode einfügen. Viele neue Stellen, an denen sich Ihr Code auf subtile Weise schlecht verhalten kann. Zum Beispiel müssen Türme nicht nur erkennen können, wie nahe sie Entitäten auf ihrer eigenen Kachel sind, sondern auch den Entitäten auf anderen Kacheln. Und sobald Sie über Kacheln nachdenken, denken Sie darüber nach, die Nachbarn von Kacheln zu finden, in die sich auch leicht Fehler einfügen lassen (insbesondere entlang der Kanten und Ecken des Spielfelds).

Kachelbasierte Welten sind sehr praktisch für die Bearbeitung von Ebenen. Mein Rat ist jedoch, die Kachelstruktur nur zum Bearbeiten zu verwenden. Lass nicht zu, dass sich die Art und Weise, wie das Level aufgebaut ist, in die Spielelogik selbst ausbreitet.

Trevor Powell
quelle
Vielen Dank, Bonus für die Bezugnahme auf die Level-Bearbeitung, weshalb dieses Spiel zunächst Kacheln enthält.
pwny
Ein Problem, das beim Bearbeiten in einer auf Kacheln basierenden Welt auftreten kann, ist, dass Sie, wenn Sie eine ziemlich große Stadt bauen, die viele Kacheln umfasst, zwischen verschiedenen Kacheln wechseln müssen und am Ende viel Zeit damit verbringen müssen, dies sicherzustellen Dinge reihen sich zwischen nebeneinander angeordneten Kacheln aneinander. (Ich gehe davon aus, dass ein benutzerdefiniertes Weltbearbeitungswerkzeug sowieso vom selben Spieleentwickler entwickelt wird.)
Randolf Richardson
3

Ich würde Weltpositionen für Ihre Entitäten verwenden. Das wird gut funktionieren, solange die Welt nicht wirklich riesig wird (wo Weltpositionen aufgrund von Präzision unpraktisch werden, so dass Sie die Welt in Stücke teilen müssen).

Sie können die aktuelle Kachel einfach aus Ihren x- und y- Koordinaten berechnen . Auch das Vorhandensein von Weltkoordinaten erleichtert das Vergleichen von Entitäten erheblich (z. B. liegt Entität X im Bereich von Turm Y? ).

Die Verwendung des anderen Ansatzes funktioniert auch, aber Sie müssen sich ständig mit 2 Koordinatensätzen befassen (Kachelindex (e) und Position innerhalb der Kachel).

Fazit: Beide Ansätze funktionieren, aber die Verwendung von Weltkoordinaten scheint viel praktischer zu sein (weniger Koordinaten, weniger Berechnungen erforderlich). Für Ihre Bequemlichkeit könnten Ihre Entitäten sogar eine Getter-Methode für ihren x- und y- Kachelindex haben, die die aktuelle Kachelposition im laufenden Betrieb berechnet.

bummzack
quelle