Wände in kachelnbasierten Spielen bauen: Was vermisse ich?

25

Nachdem ich heute einige Zeit damit verbracht habe, einige Notizen über die Implementierung von Wänden in mein auf Kacheln basierendes Spiel zu machen, wurde mir plötzlich klar, dass es nicht so einfach sein wird, wie ich es mir vorgestellt hatte. Während der aktuelle Stand meiner Arbeit nicht annähernd der tatsächlichen Erstellung des wandbezogenen Codes entspricht, habe ich mir drei verschiedene Möglichkeiten ausgedacht, dies zu tun. Im Moment bin ich mir nicht sicher, welche meiner Ideen am besten funktionieren wird und ob ich etwas verpasst habe oder nicht.

Wichtig: Ein Charakter KANN auf einer Fliese stehen, die Wände hat, unabhängig von ihrer Form.

Allen drei Varianten gemeinsam ist, dass die Tilemap in einem eindimensionalen, auf std :: vector (oder ähnlichen) basierenden Container "aufbewahrt" wird. Die Gründe dafür werden (erstaunlich) in Antworten auf eine andere Frage erläutert.

Behälterklassen in Spielsteinen.

Zurück zu den Wänden.

A) Der einfache Ansatz.

Hier ist nichts Besonderes. Jeder Kachelbehälter kann nicht nur Zeichen enthalten, sondern auch ein oder mehrere Wandobjekte, die an der Kante innerhalb der Kachel angebracht sind.

Erste Ansatz

Vorteile: einfach zu implementieren, nichts am Motor zu ändern. Nachteile: Zwei Dinge. Eins - es mag nur in meinem Kopf sein, aber einige Kombinationen sehen einfach hässlich aus. Zweitens - dieser Ansatz ermöglicht es, aus zwei benachbarten Fliesen eine Doppelwand herzustellen. Das Bauen wird ein wichtiger Teil des Spiels sein, und Doppelwände ermöglichen es den Bauherren, möglicherweise auf die Verbesserung des Materials der Wände durch Spielmittel zu verzichten und nur eine erhöhte Haltbarkeit durch Verdoppelung der vorhandenen Wand zu erreichen. Das ist nicht wünschenswert. Sicher, ich könnte ein Verfahren einschließen, das Doppelwandigkeit verbietet, aber es wird ein schlechtes Gefühl haben.

B) Der kluge (?) Ansatz.

Anstatt die Spieler die ganze Karte doppelwandig spielen zu lassen, werde ich sie schlagen. Jede Wand hat zwei Hälften, die von innen an der Kante der Fliese befestigt sind. Um eine einzelne "Wandeinheit" zu erstellen, muss ich zwei Half-Wall-Objekte in zwei benachbarten Kacheln erstellen.

Zweiter Ansatz

Vorteile: Es ist symmetrisch !!! Es ist auch keine wesentliche Änderung der aktuellen Motorspezifikationen erforderlich. Nachteile: Mehr Ärger, mehr Objekte und natürlich die "Kappen". Wie Sie auf dem Bild sehen können, wird eine Ecke im Grunde nach einem "Kappen" -Objekt schreien. Ich bin wirklich cool damit, es ist nicht so schwer hinzuzufügen. Hey, ich habe schon einen Plan für dünne Säulen aus vier verbundenen Kappen. Süss. Trotzdem habe ich einige Bedenken hinsichtlich möglicher Probleme mit dem Sichtfeld und der Sichtlinie.

C) Die Gesamtüberholungsvariante.

Oder ich könnte einfach Rahmen und Ecken als separate Container für Spielobjekte erstellen. Genau so.

Dritter Ansatz

Vorteile: Nicht einmal sicher. Nun, es ist unkompliziert. Bestimmt. Nachteile: Es ist eine Überholung erforderlich. Zum Glück nicht vom Code, sondern von der aktuellen Spielmechanik - das ist sicher. Die Vorteile liegen nicht so auf der Hand. Auch diese Annäherung erfordert viel mehr Behälter als die zwei vorhergehenden. Die Indizierungsmathematik wird auch ein bisschen mühsam sein.

Hier haben wir es also - drei verschiedene Arten, Wände zwischen Fliesen herzustellen. Wenn es Alternativen gibt, werde ich sie gerne prüfen. Wenn es irgendwelche Vorteile / Nachteile für einen der Ansätze gibt, die ich nicht gesehen habe - weisen Sie bitte darauf hin.

norien
quelle
2
A.2: Als A können nur zwei Seiten - zum Beispiel Nord und West - eine Mauer haben. Das ist der Ansatz, den X-Com verfolgt.
Martin Sojka
@ Martin Sojka Das hinterlässt ein Loch in den südöstlichen Ecken. Trotzdem kann es nützlich sein, Modell C auf diese Weise zu betrachten. Jede Fliese kann eine Kombination aus drei verschiedenen Wandelementen aufweisen, der Nord-, West- und Nordwestecke.
aaaaaaaaaaa
Die Wände sind also sichtbar, nehme ich an? Nicht nur Fliesenränder blockieren. Warum brauchen Sie zwei Hälften in Option B? Warum nicht einfach eine Wand, die zur Hälfte auf die andere Fliese versetzt ist?
Richard Marskell - Drackir
@eBusiness Wenn Sie nur Wände im Norden und Westen zulassen, können Sie Wände im Süden und Osten simulieren, indem Sie nur Wände im Norden und Westen der darunter liegenden Kacheln platzieren.
Tetrad
Ich würde vorschlagen, mit C zu gehen. Es ist das, was ich in dieser jemgine.omnisu.com/wp-content/uploads/2011/06/gnomecolony.png mache und es funktioniert ziemlich gut. Das einzige Problem ist der äußerste südöstliche Rand der Karte. Daran müssen Sie etwas ändern.
Blecki

Antworten:

14

Ich würde Ihre Methode 'B' verwenden.

Um keine "Kappen" zu benötigen, verlängern Sie einfach jede Wand "1/2 Wandstärke" in beide Richtungen. Dadurch entstehen überlappende Wände, an denen sie sich treffen. Ihre Diagramme legen jedoch bereits nahe, dass dies kein Problem darstellt.

In Methode 'B', Bild 3, würde sich die horizontale Wand ein Stück nach links erstrecken, und die vertikale Wand würde sich ein Stück nach oben erstrecken.

[Ich bin neu hier, gerade registriert. Vermisse ich etwas, da ich keine Schaltfläche zum Hinzufügen eines Kommentars zu Ihrem ursprünglichen Beitrag sehen kann? Ist das ein Privileg von Menschen mit höherem Ansehen? Oder übersehe ich das Offensichtliche? Entschuldigen Sie, dass Sie dies als "Antwort" hinzugefügt haben.]

Doug.McFarlane
quelle
1
Dies ist eine Antwort, und ich glaube, es ist eine Reputationsstufe von 100 (?), Die zu kommentieren ist. Willkommen im Gamedev SE! :)
Die kommunistische Ente
2

Du hast bemerkt, dass ein Charakter auf einem Feld stehen kann, das eine Wand enthält, aber hast du darüber nachgedacht, jedes Feld als Wand selbst zu behandeln? Sogar eine halbe Fliese als horizontale oder vertikale Wand?

Vorteile: Berechnungen und Platzierungen sind trivial, Kollisionen sind trivial, wenn alle Berechnungen und Kollisionen nur auf den Koordinaten der Wandplatzierung basieren.

Nachteile: Es kann sich auf Ihre gesamte Implementierung, Ihren Code und Ihre Grafiken auswirken. Sie möchten Ihre Methode auch nicht ganz aufgeben, sondern möchten immer noch spezielle Fälle, in denen nur ein Teil einer Kachel eine Wand ist (Link zur Vergangenheit mit Klippen).

Auf diese Weise hätte ich meine Implementierung für die Zukunft aufgebaut und gewusst, dass ich immer auf ein Plättchen verweisen und eine Berechnung darauf durchführen kann, abhängig von der Position meines Charakters und der Art des Plättchens.

Eine Burgmauer Ich könnte einfach eine Berechnung von der Mitte aus durchführen und eine Kiste zeichnen, durch die ich nicht hindurch konnte. Wenn es sich um einen runden Stein handelt, könnte ich dieselbe Berechnung von der Mitte aus durchführen, aber als Kreis, damit sich mein Charakter so bewegen kann, wie er war gerundet.

Bryan Harrington
quelle
1

Tut mir leid zu sagen, aber der dritte Weg ist wirklich der Weg zu denken. Nun, Sie haben bereits die Fähigkeit, dies zu tun. Lassen Sie uns also weitermachen und über die anderen beiden nachdenken!

Die Sache ist, dass eine Wand eine Nullbreite ist, zwei dimensionale (Höhe * Länge, in einer 3D-Welt) Quadrate, die zwei Kästen unterteilen. Sie sollten sie als solche betrachten, aber Sie könnten eine einfachere Lösung verwenden, als wenn Sie Ihren Dungeon bauen (besonders wenn andere Leute Teile bauen könnten).

Es scheint ein Top-Down-2D-Spiel zu sein, bei dem Wände "eine Breite" haben und diese Ecke (Ihr "Kappen" -Objekt) benötigen. Dies ist jedoch ausschließlich "Grafik", also würde ich mit einer Art von gehen:

Eine 2D-Karte mit den Kacheln (dh Kacheltyp und dergleichen).

Eine 2D-Karte mit 2 Wänden, z. unten und rechts (die linke Wand ist die "rechte Wand" in der Kachel links von dieser).

+ Eine Logik, die alle Wände und "Kappen" usw. zeichnet.

So trennen sich Logik und Grafik. Sie könnten eine "Schnittstelle" erstellen, die sich um Dinge wie SetWall (ThisTile, LEFT, NOWALL) kümmert -> die rechte Wand der Kachel links von ThisTile auf "NOWALL" setzen ...

Vielleicht scheint dies verschwommen, aber die Sache ist, dass Sie immer versuchen sollten, auf der einen Seite die Logik (die tatsächlichen Daten, ohne Redundanz) und auf der anderen Seite die "Zeichnung der Daten" zu haben, die berechnet, ob eine "Kappe" erforderlich ist ' etc.

++

Valmond
quelle