Wählen Sie eine Kachel basierend auf benachbarten Kacheln

10

Ich arbeite an einem gekachelten Karteneditor und muss Kacheln automatisch auswählen, basierend auf den angrenzenden Kacheln. Wenn Sie beispielsweise eine Straßenkachel neben einer anderen Straßenkachel platzieren, müssen die beiden so ausgerichtet werden, dass sie eine durchgehende Straße bilden. Wenn andere Straßen um sie herum sind, müssen wir möglicherweise Eck- oder Kreuzungskacheln verwenden.

Kann jemand einige Algorithmen dafür empfehlen? Das Spiel verwendet eine quadratische Kachelkarte mit 8 Richtungen.

Alekop
quelle
Können Sie nicht einfach alle umliegenden 8 Kacheln untersuchen, wenn der Benutzer eine neue Kachel ablegt, und die neue Kachel entsprechend ausrichten? Natürlich müssen Sie auf jeder Kachel einige zusätzliche Informationen wie Ausrichtung und Typ speichern.
XiaoChuan Yu
Ich untersuche alle umgebenden Kacheln, wusste aber nicht, wie ich mit allen Kachelkombinationen umgehen soll. Sie haben beispielsweise sieben mögliche Kacheln zur Auswahl (horizontal, vertikal, vier Ecken und ein Kreuz). Ich dachte daran, komplizierte switch-Anweisungen zu verwenden, aber das fühlte sich falsch an.
Alekop

Antworten:

18

Vielleicht wird das normalerweise so gemacht. Sie haben eine Liste mit verschiedenen Kacheln, die Straßenkacheln in all ihren möglichen Ausrichtungen darstellen. Von links nach rechts, alle vier Ecken, von oben nach unten, was auch immer. Jetzt indizieren Sie alle diese Kacheln mit jeweils einem Byte. 8 Bits, eines für jede Richtung. Dies kann in einer Hashmap oder nach Dateiname erfolgen ... wie auch immer Sie dies tun möchten.

Sie haben also Folgendes:

Geben Sie hier die Bildbeschreibung ein

Der Bytecode für die obige Kachel lautet 00000000 . Dann ist Ihre Kachel, die von links nach rechts (oder von rechts nach links) geht, wie folgt:

Geben Sie hier die Bildbeschreibung ein

Der Bytecode für diese Kachel lautet 10001000 oder 136. Als weiteres Beispiel sehen wir uns einen Drei-Wege-Schnittpunkt an:

Geben Sie hier die Bildbeschreibung ein

Der Bytecode für diese Kachel lautet 10101000 .

Sie sehen wahrscheinlich, wohin ich gehe. Sie setzen Bitpositionen im Byte, die Verbindungen darstellen. Dies ist weitaus besser als der Versuch, eine große if / else-Kette zu erstellen, die ich zuvor gesehen habe. Wenn Sie eine Kachel platzieren möchten, untersuchen Sie die Kacheln um sie herum und erstellen Sie unterwegs ein Byte. Setzen Sie 1 für Kacheln mit Straßen (oder was auch immer Sie verbinden möchten) und 0 für Kacheln ohne Straßen. Wenn Sie fertig sind, haben Sie den Bytecode für die genaue Kachel, die Sie benötigen.

Beachten Sie, dass Sie beim Erstellen der Assets viele davon wiederverwenden können, indem Sie sie einfach drehen und den richtigen Bytecode zuweisen.

BEARBEITEN : Bilder wurden aktualisiert, um weniger beschissen zu sein. Ja das sind besser als vorher.

MichaelHouse
quelle
Sehr schön! Einfach und effizient. Das einzige, was ich nicht verstehe, ist, wie Sie diese Bitmasken bekommen. Wie bekommt man zum Beispiel eine Bitmaske von 17 aus den Zahlen 3 und 7?
Alekop
Egal, ich verstehe, was du tust. Sie setzen die Bits 3 und 7, aber Sie zählen von links statt von rechts.
Alekop
Oh wow, wie peinlich. Habe meine Endianness durcheinander gebracht. Das war ein Unfall, das werde ich beheben!
MichaelHouse
Großartig, jetzt macht mein Kommentar keinen Sinn! : p Nur ein Scherz, danke für deine Antwort. Genau das habe ich gesucht.
Alekop
1
Gute Erklärung. Ich habe einen Blog-Beitrag über die gleiche Technik mit der tatsächlichen Code- und Kachelauflösung
kitsu.eb
3

Ich würde empfehlen, dass Sie sich diese praktische Seite ansehen, um weitere Informationen zu erhalten, da sie detailliert auf so ziemlich jeden Aspekt Ihrer Arbeit sowie auf einige mögliche Optimierungen eingeht: http://www.angryfishstudios.com / 2011/04 / Abenteuer in der Bitmaske /

Das tldr ist, dass Sie jede benachbarte Zelle abfragen und die Kombination in einem Bitfeld / Byte speichern und sie dann durch eine Karte leiten, die eine Zahl von 0 bis 255 in einen Wert von 0 bis 47 umwandelt, was einem eindeutigen Bild entspricht.

Kyle Baran
quelle