So verwenden Sie die Kachelbitmaske, um Ihre Ebenenlayouts automatisch zu kacheln

Die Erstellung eines optisch ansprechenden und abwechslungsreichen Kachelsets ist zeitaufwändig, aber die Ergebnisse sind es oft wert. Aber selbst wenn Sie die Kunst erstellt haben, müssen Sie sie immer noch in Ihrem Level zusammenstellen! 

Sie können jede Kachel einzeln von Hand platzieren, oder Sie können den Vorgang mit automatisieren Bitmasking, Sie müssen also nur die Form des Geländes zeichnen.

Was ist Fliesen-Bitmasking??

Bei der Kachelbitmaske handelt es sich um eine Methode zum automatischen Auswählen des entsprechenden Sprites aus einem definierten Kachelsatz. Auf diese Weise können Sie ein generisches Platzhalterplättchen überall dort platzieren, wo ein bestimmter Geländetyp angezeigt werden soll, anstatt von Hand eine potentiell riesige Auswahl verschiedener Plättchen zu platzieren. 

Sehen Sie dieses Video für eine Demonstration:

(Sie können die Demos und Quelldateien vom GitHub-Repo herunterladen.)

Bei mehreren Geländetypen kann die Anzahl der verschiedenen Variationen 300 oder mehr Kacheln überschreiten. Das Zeichnen dieser vielen verschiedenen Sprites ist definitiv ein zeitaufwändiger Prozess, aber die Bitmaskierung von Kacheln gewährleistet, dass das Platzieren dieser Kacheln schnell und effizient ist.

Bei einer statischen Implementierung von Bitmasking werden Karten zur Laufzeit generiert. Mit ein paar kleinen Verbesserungen können Sie das Bitmasking erweitern, um dynamische Kacheln zu ermöglichen, die sich während des Spiels ändern. In diesem Lernprogramm werden die Grundlagen der Bitmaskierung von Kacheln behandelt, während komplexere Implementierungen mit Eckkacheln und verschiedenen Geländetypen durchgeführt werden.

Wie Tile Bitmasking funktioniert

Überblick

Bei der Kachelbitmaske geht es darum, einen numerischen Wert zu berechnen und basierend auf diesem Wert ein bestimmtes Sprite zuzuweisen. Jede Kachel betrachtet die benachbarten Kacheln, um zu bestimmen, welches Sprite aus dem Satz sich selbst zugewiesen werden soll. 

Jedes Sprite in einem Tileset ist nummeriert und der Bitmasking-Prozess gibt eine Nummer zurück, die der Position eines Sprites im Tileset entspricht. Zur Laufzeit wird das Bitmasking-Verfahren ausgeführt, und jede Kachel wird mit dem entsprechenden Sprite aktualisiert.

Das obige Sprite-Blatt besteht aus Geländefeldern mit allen möglichen Randkonfigurationen. Die Zahlen auf jeder Kachel stellen den Bitmasking-Wert dar, den wir im nächsten Abschnitt lernen werden. Für den Moment ist es wichtig zu verstehen, wie der Bitmasking-Wert sich auf das Terrain-Tileset bezieht. Die Sprites werden nacheinander geordnet, so dass ein Bitmasking-Wert von 0 Das erste Sprite wird bis zu einem Wert von zurückgegeben fünfzehn was die 16 zurückgibtth Sprite. 

Berechnung des Bitmasking-Werts

Die Berechnung dieses Wertes ist relativ einfach. In diesem Beispiel gehen wir von einem einzelnen Geländetyp ohne Eckstücke aus. 

Jede Kachel prüft, ob Kacheln im Norden, Westen, Osten und Süden vorhanden sind, und jede Prüfung gibt einen Booleschen Wert zurück 0 repräsentiert einen leeren Raum und 1 bedeutet das Vorhandensein eines anderen Geländefelds. 

Dieses boolesche Ergebnis wird dann mit dem binären Richtungswert multipliziert und zur laufenden Summe des Bitmasking-Werts addiert. Dies ist anhand einiger Beispiele einfacher zu verstehen:

4-Bit-Richtungswerte

  • Norden = 20 = 1
  • Westen = 21 = 2
  • Ost = 22 = 4
  • Süd = 23 = 8

Das grüne Quadrat in der Abbildung oben stellt das Terrain-Feld dar, das wir berechnen. Wir beginnen mit der Suche nach einem Stein im Norden. Es gibt keine Kachel im Norden, daher gibt die boolesche Prüfung einen Wert von zurück 0. Wir multiplizieren 0 mit dem Richtungswert für Nord, 20 = 1, was uns gibt 1 * 0 = 0

Bei einem Terrain-Plättchen, das vollständig von leerem Raum umgeben ist, wird jeder boolesche Check zurückgegeben 0, was zu einer 4-Bit-Binärzahl führt 0000 oder 1 * 0 + 2 * 0 + 4 * 0 + 8 * 0 = 0. Es gibt insgesamt 16 mögliche Kombinationen, von 0 bis 15, also die 1st Sprite im Tileset wird verwendet, um diese Art von Terrain-Tile mit einem Wert von darzustellen 0.

Ein Terrain-Plättchen, das im Norden von einem einzelnen Plättchen begrenzt wird, gibt den binären Wert von zurück 0001, oder 1 * 1 + 2 * 0 + 4 * 0 + 8 * 0 = 1. Die 2nd Sprite im Tileset wird verwendet, um diese Art von Gelände mit einem Wert von darzustellen 1.

Ein Geländefeld, das im Norden von einem Feld und im Osten von einem Feld begrenzt wird, gibt den binären Wert von zurück 0101, oder 1 * 1 + 2 * 0 + 4 * 1 + 8 * 0 = 5. Das 6. Sprite im Tileset wird verwendet, um diese Art von Gelände mit einem Wert von darzustellen 5.

Ein Geländefeld, das im Osten von einem Feld und im Westen von einem Feld begrenzt wird, gibt den binären Wert von zurück 0110, oder 1 * 0 + 2 * 1 + 4 * 1 + 8 * 0 = 6. Das 7. Sprite im Tileset wird verwendet, um diese Art von Gelände mit einem Wert von darzustellen 6.

Sprites den Kacheln zuordnen

Nachdem wir den Bitmasking-Wert eines Tiles berechnet haben, weisen wir das entsprechende Sprite aus dem Tileset zu. Dieser letzte Schritt kann in Echtzeit ausgeführt werden, während die Karte geladen wird, oder das Ergebnis kann gespeichert und zur weiteren Bearbeitung in den gewünschten Kacheleditor geladen werden.

Die Abbildung links stellt ein 4-Bit-Terrain-Kachelset dar, wie es auf einem Kachelblatt nacheinander erscheinen würde. Die Abbildung rechts zeigt, wie die Kacheln im Spiel aussehen, nachdem sie mit dem Bitmasking-Verfahren platziert wurden. Jedes Plättchen wird mit seinem Bitmasking-Wert markiert, um die Beziehung zwischen der Reihenfolge eines Plättchens auf dem Plättchenblatt und seiner Position im Spiel anzuzeigen. 

Betrachten wir als Beispiel die Kachel in der rechten oberen Ecke der Abbildung rechts. Diese Fliese ist im Westen und in Souh von Fliesen begrenzt. Die boolesche Prüfung gibt einen binären Wert von zurück 1010, oder 1 * 0 + 2 * 1 + 4 * 0 + 8 * 1 = 10. Dieser Wert entspricht der 11th Sprite im Fliesenblatt.

Tileset-Komplexität

Die Anzahl der erforderlichen booleschen Richtungsprüfungen hängt von der beabsichtigten Komplexität Ihres Kachelsets ab. Wenn Sie Eckstücke ignorieren, können Sie diese vereinfachte 4-Bit-Lösung verwenden, für die nur vier binäre Richtungsprüfungen erforderlich sind. 

Was passiert aber, wenn Sie visuell ansprechenderes Gelände schaffen wollen? Sie müssen sich mit dem Vorhandensein von Eck-Kacheln befassen, wodurch die Anzahl der Sprites von 16 auf 48 erhöht wird. Das folgende 8-Bit-Bitmasking-Beispiel erfordert acht boolesche Richtungsprüfungen pro Kachel.

8-Bit-Bitmasking mit Eckfliesen

In diesem Beispiel erstellen wir ein Top-Down-Kachelset, das grasbewachsenes Gelände in der Nähe des Ozeans darstellt. In diesem Fall befindet sich unser Ozean auf einer Ebene unter den Geländefeldern. Dies ermöglicht uns, eine Lösung für ein Gelände zu verwenden, während die Illusion beibehalten wird, dass zwei Geländetypen kollidieren. 

Sobald das Spiel läuft und das Bitmasking-Verfahren abgeschlossen ist, werden sich die Sprites niemals ändern. Dies ist eine nahtlose, statische Implementierung von Bitmasking, bei der alles stattfindet, bevor der Spieler die Kacheln sieht.

Corner Tiles wird vorgestellt

Wir möchten, dass das Gelände optisch interessanter ist als die vorherige 4-Bit-Lösung. Daher sind Eckstücke erforderlich. Diese zusätzliche visuelle Komplexität erfordert für den Künstler, Programmierer und das Spiel selbst eine exponentielle zusätzliche Arbeit. Wenn wir das erweitern, was wir aus der 4-Bit-Lösung gelernt haben, können wir schnell verstehen, wie wir an die 8-Bit-Lösung herangehen.

Hier ist das komplette Sprite-Blatt für unsere Geländekacheln. Merkst du etwas Besonderes über die Anzahl der Fliesen? Das 4-Bit-Beispiel von früher ergab 24 = 16 Kacheln, also sollte dieses 8-Bit-Beispiel sicher 2 ergeben8 = 256 Kacheln, aber es gibt deutlich weniger als dort. 

Es ist zwar richtig, dass dieses 8-Bit-Bitmasking-Verfahren 256 mögliche Binärwerte ergibt, aber nicht jede Kombination erfordert eine völlig eindeutige Kachel. Das folgende Beispiel erläutert, wie 256 Kombinationen mit nur 48 Kacheln dargestellt werden können.

8-Bit-Richtungswerte

  • Nordwesten = 20 = 1
  • Norden = 21 = 2
  • Nordosten = 22 = 4
  • Westen = 23 = 8
  • Ost = 24 = 16
  • Südwesten = 25 = 32
  • Süd = 26 = 64
  • Südosten = 27 = 128

Jetzt machen wir acht Boolesche Richtungsprüfungen Die mittlere Kachel darüber ist im Norden, Nordosten und Osten von Kacheln begrenzt. Diese boolesche Prüfung gibt also einen binären Wert von zurück 00010110 oder 1 * 0 + 2 * 1 + 4 * 1 + 8 * 0 + 16 * 1 + 32 * 0 + 64 * 0 + 128 * 0 = 22.

Die Kachel links oben ähnelt der vorherigen Kachel, ist jetzt aber auch im Südwesten und Südosten mit Kacheln begrenzt. Diese boolesche Richtungsprüfung sollte Liefert einen binären Wert von 10110110, oder 1 * 0 + 2 * 1 + 4 * 1 + 8 * 0 + 16 * 1 + 32 * 1 + 64 * 0 + 128 * 1 = 182

Dieser Wert unterscheidet sich von der vorherigen Kachel, aber beide Kacheln wären tatsächlich visuell identisch, sodass sie überflüssig werden. 

Um die Redundanzen zu beseitigen, fügen wir unserer booleschen Richtungsprüfung eine zusätzliche Bedingung hinzu: bei der Prüfung auf Vorhandensein von Grenzen Ecke Kacheln, müssen wir auch nach benachbarten Kacheln in den vier Himmelsrichtungen (direkt nach Norden, Osten, Süden oder Westen) suchen.. 

Zum Beispiel ist die Fliese im Nordosten von vorhandenen Plättchen benachbart, die Fliesen im Südwesten und im Südosten nicht. Dies bedeutet, dass die Südwest- und Südost-Kacheln nicht in die Bitmasking-Berechnung einbezogen werden. 

Bei dieser neuen Bedingung gibt diese boolesche Prüfung einen binären Wert von zurück 00010110 oder 1 * 0 + 2 * 1 + 4 * 1 + 8 * 0 + 16 * 1 + 32 * 0 + 64 * 0 + 128 * 0 = 22 genau wie vorher. Jetzt können Sie sehen, wie die 256 Kombinationen mit nur 48 Kacheln dargestellt werden können.

Fliesenauftrag

Ein weiteres Problem, das Sie möglicherweise feststellen, ist, dass die durch das 8-Bit-Bitmasking-Verfahren berechneten Werte nicht mehr mit der Reihenfolge der Kacheln im Sprite-Sheet korrelieren. Es gibt nur 48 Kacheln, aber unsere möglichen berechneten Werte reichen von 0 bis 255, sodass wir den berechneten Wert nicht mehr als direkte Referenz verwenden können, wenn Sie das entsprechende Sprite verwenden. 

Was wir also brauchen, ist eine Datenstruktur, die die Liste der berechneten Werte und die entsprechenden Kachelwerte enthält. Wie Sie dies implementieren möchten, liegt ganz bei Ihnen. Denken Sie jedoch daran, dass die Reihenfolge, in der Sie nach umliegenden Kacheln suchen, die Reihenfolge bestimmt, in der Ihre Kacheln im Sprite-Sheet platziert werden sollen. 

In diesem Beispiel prüfen wir in der folgenden Reihenfolge nach angrenzenden Kacheln: Nordwesten, Norden, Nordosten, Westen, Osten, Südwesten, Süden, Südosten. 

Nachfolgend finden Sie den vollständigen Satz von Bitmasking-Werten, die sich auf die Positionen der Kacheln in unserem Sprite-Sheet beziehen (verwenden Sie diese Werte in Ihrem Projekt, um Zeit zu sparen):

2 = 1, 8 = 2, 10 = 3, 11 = 4, 16 = 5, 18 = 6, 22 = 7, 24 = 8, 26 = 9, 27 = 10, 30 = 11, 31 = 12, 64 = 13, 66 = 14, 72 = 15, 74 = 16, 75 = 17, 80 = 18, 82 = 19, 86 = 20, 88 = 21, 90 = 22, 91 = 23, 94 = 24, 95 = 25 104 = 26, 106 = 27, 107 = 28, 120 = 29, 122 = 30, 123 = 31, 126 = 32, 127 = 33, 208 = 34, 210 = 35, 214 = 36, 216 = 37, 218 = 38, 219 = 39, 222 = 40, 223 = 41, 248 = 42, 250 = 43, 251 = 44, 254 = 45, 255 = 46, 0 = 47

Mehrere Geländetypen

Alle unsere vorherigen Beispiele gehen von einem einzigen Geländetyp aus. Was aber, wenn wir ein zweites Terrain in die Gleichung einführen? Wir brauchen ein 5-Bit Bitmasking-Lösung, und wir müssen unsere zwei Geländetypen definieren. Wir müssen auch der mittleren Kachel einen Wert zuweisen, der nur unter bestimmten Bedingungen gezählt wird. Denken Sie daran, dass wir nicht mehr wie in den vorherigen Beispielen "leeren Raum" berücksichtigen. Fliesen müssen jetzt auf allen Seiten von einem anderen Stein umgeben sein.

Die obige Abbildung zeigt ein Beispiel mit zwei Geländetypen und ohne Eckkacheln. Typ 1 immergibt einen Wert von zurück 0 wann immer es während der Richtungsprüfung erkannt wird; Der mittlere Kachelwert wird berechnet und verwendet nur wenn es sich um Geländetyp 2 handelt. 

Die mittlere Kachel im obigen Beispiel ist im Norden, Westen und Osten vom Terrain Typ 2 und im Süden vom Terrain Typ 1 umgeben. Das mittlere Feld ist Terrain-Typ 1 und wird daher nicht gezählt. Diese boolesche Prüfung gibt einen binären Wert von zurück  00111, oder  1 * 1 + 2 * 1 + 4 * 1 + 8 * 0 + 16 * 0 = 7.

In diesem Beispiel ist das mittlere Feld der Terrain-Typ 2, daher wird es bei der Berechnung mitgezählt. Die mittlere Kachel ist im Norden und Westen von Terrain Typ 2 umgeben. Es ist auch von Gelände Typ 1 im Osten und Süden umgeben. Diese boolesche Prüfung gibt einen binären Wert von zurück  10011, oder  1 * 1 + 2 * 1 + 4 * 0 + 8 * 0 + 16 * 1 = 19 .

Dynamische Implementierung

Die Bitmasking-Berechnung kann auch während des Spiels durchgeführt werden, um Änderungen der Platzierung und des Aussehens der Spielsteine ​​in Echtzeit zu ermöglichen. Dies ist nützlich für zerstörbares Gelände sowie für Spiele, die das Basteln und Bauen ermöglichen. Das anfängliche Bitmasking-Verfahren ist für alle Kacheln obligatorisch, zusätzliche dynamische Berechnungen sollten jedoch nur durchgeführt werden, wenn dies unbedingt erforderlich ist. Zum Beispiel würde ein zerstörtes Geländefeld die Bitmaskingberechnung nur für umgebende Felder auslösen.

Fazit

Das Bitmasking von Fliesen ist das perfekte Beispiel für den Aufbau eines funktionierenden Systems, das Sie bei der Entwicklung von Spielen unterstützt. Es ist nicht etwas, was die Erfahrung des Spielers direkt beeinflusst. Stattdessen bietet diese Methode der Automatisierung eines zeitaufwändigen Teils des Leveldesigns einen wertvollen Vorteil für den Entwickler. Um es einfach auszudrücken: Fliese Bitmasking ist eine schnelle Möglichkeit, das Spiel für Ihre Drecksarbeit zu sorgen, sodass Sie sich auf wichtigere Aufgaben konzentrieren können.