Advertisement
  1. Code
  2. Coding Fundamentals
  3. Game Development

Wie man Tile Bitmasking verwendet, um Ihre Level-Layouts automatisch zu kacheln

Scroll to top
Read Time: 11 min

() translation by (you can also view the original English article)

Die Herstellung eines optisch ansprechenden und abwechslungsreichen Kachelsets ist ein zeitaufwändiger Prozess, aber die Ergebnisse sind es oft wert. Aber auch nach dem Erstellen der Kunst müssen Sie alles in Ihrem Level zusammenfügen!

Sie können jede Kachel einzeln von Hand platzieren - oder Sie können den Prozess mithilfe der Bitmaske automatisieren, sodass Sie nur die Form des Geländes zeichnen müssen.

Was ist Tile Bitmasking?

What is tile bitmaskingWhat is tile bitmaskingWhat is tile bitmasking

Tile Bitmasking ist eine Methode zur automatischen Auswahl des geeigneten Sprites aus einem definierten Kachelsatz. Auf diese Weise können Sie eine generische Platzhalterkachel überall dort platzieren, wo ein bestimmter Geländetyp angezeigt werden soll, anstatt eine potenziell enorme Auswahl verschiedener Kacheln von Hand zu platzieren.

Sehen Sie sich dieses Video für eine Demonstration an:

(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 Tile Bitmasking von Kacheln stellt sicher, dass das Platzieren dieser Kacheln schnell und effizient erfolgt.

Mit einer statischen Implementierung von Bitmasking werden Maps zur Laufzeit generiert. Mit ein paar kleinen Änderungen können Sie die Bitmaske erweitern, um dynamische Kacheln zu ermöglichen, die sich während des Spiels ändern. In diesem Tutorial werden wir die Grundlagen von Tile Bitmasking behandeln und uns auf kompliziertere Implementierungen konzentrieren, die Eckkacheln und mehrere Geländetypen verwenden.

Wie man Tile Bitmasking funktioniert

Überblick

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

Jedes Sprite in einem Kachelsatz ist nummeriert, und der Bitmaskierungsprozess gibt eine Nummer zurück, die der Position eines Sprites im Kachelsatz entspricht. Zur Laufzeit wird die Bitmaskenprozedur ausgeführt und jede Kachel wird mit dem entsprechenden Sprite aktualisiert.

Example terrain sprite sheet for tile bitmaskingExample terrain sprite sheet for tile bitmaskingExample terrain sprite sheet for tile bitmasking

Das obige Sprite-Blatt besteht aus Geländekacheln mit allen möglichen Randkonfigurationen. Die Zahlen auf jeder Kachel stellen den Bitmaskenwert dar, den wir im nächsten Abschnitt berechnen werden. Im Moment ist es wichtig zu verstehen, wie sich der Bitmaskenwert auf das Geländekachelset bezieht. Die Sprites sind nacheinander angeordnet, sodass ein Bitmaskenwert von 0 das erste Sprite bis zu einem Wert von 15 zurückgibt, der das 16. Sprite zurückgibt.

Berechnung des Bitmasking-Werts

Die Berechnung dieses Wertes ist relativ einfach. In diesem Beispiel nehmen wir einen einzelnen Geländetyp ohne Eckstücke an.

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, wobei 0 einen leeren Raum darstellt und 1 das Vorhandensein einer anderen Geländekachel anzeigt.

Dieses boolesche Ergebnis wird dann mit dem binären Richtungswert multipliziert und zur laufenden Summe des Bitmaskenwerts addiert - anhand einiger Beispiele ist dies leichter zu verstehen:

4-Bit-Richtungswerte

  • Norden = 20 = 1
  • West = 21 = 2
  • Ost = 22 = 4
  • Süd = 23 = 8
Tile bitmasking exampleTile bitmasking exampleTile bitmasking example

Das grüne Quadrat in der Abbildung oben repräsentiert die von uns berechnete Geländekachel. Wir beginnen mit der Suche nach einer Kachel im Norden. Da es im Norden keine Kachel gibt, gibt die Boolesche Prüfung den Wert 0 zurück. Wir multiplizieren 0 mit dem Richtungswert für Nord, 20 = 1, was 1*0 = 0 ergibt.

Für eine Geländekachel, die vollständig von Leerzeichen umgeben ist, gibt jede Boolesche Prüfung 0 zurück, was zur 4-Bit-Binärzahl 0000 oder 1*0 + 2*0 + 4*0 + 8*0 = 0 führt. Insgesamt gibt es 16 mögliche Kombinationen von 0 bis 15, daher wird das erste Sprite im Kachelsatz verwendet, um diese Art von Geländekacheln mit dem Wert 0 darzustellen.

Tile bitmasking exampleTile bitmasking exampleTile bitmasking example
Eine Geländekachel, die im Norden von einer einzelnen Kachel begrenzt wird, gibt einen Binärwert von 0001 oder 1*1+ 2*0+ 4*0+ 8*0 = 1 zurück. Das 2. Sprite im Kachelsatz wird zur Darstellung dieses Typs verwendet Gelände mit einem Wert von 1.
Tile bitmasking exampleTile bitmasking exampleTile bitmasking example

Eine Geländekachel, die im Norden von einer Kachel und im Osten von einer Kachel begrenzt wird, gibt einen Binärwert von 0101 oder 1*1 + 2*0 + 4*1 + 8*0 = 5 zurück. Das 6. Sprite im Kachelsatz ist wird verwendet, um diesen Geländetyp mit einem Wert von 5 darzustellen.

Tile bitmasking exampleTile bitmasking exampleTile bitmasking example

Eine Geländekachel, die im Osten von einer Kachel und im Westen von einer Kachel begrenzt wird, gibt einen Binärwert von 0110 oder 1*0 + 2*1 + 4*1 + 8*0 = 6 zurück. Das 7. Sprite im Kachelsatz ist wird verwendet, um diesen Geländetyp mit einem Wert von 6 darzustellen.

Zuweisen von Sprites zu Kacheln

Nach der Berechnung des Bitmaskenwerts einer Kachel weisen wir das entsprechende Sprite aus dem Kachelsatz 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 Kacheleditor Ihrer Wahl geladen werden.

Tile bitmasking how tiles are assigned based on the terrains shapeTile bitmasking how tiles are assigned based on the terrains shapeTile bitmasking how tiles are assigned based on the terrains shape

Die Abbildung links zeigt ein 4-Bit-Kachelset für ein einzelnes Gelände, wie es nacheinander auf einem Kachelblatt angezeigt wird. Die Abbildung rechts zeigt, wie die Kacheln im Spiel aussehen, nachdem sie mithilfe des Bitmasking-Verfahrens platziert wurden. Jedes Plättchen ist mit seinem Bitmaskenwert markiert, um die Beziehung zwischen der Reihenfolge eines Plättchens auf dem Plättchenblatt und seiner Position im Spiel anzuzeigen.

Lassen Sie uns als Beispiel die Kachel in der oberen rechten Ecke der Abbildung rechts untersuchen. Diese Kachel wird im Westen und in Souh von Kacheln begrenzt. Die Boolesche Prüfung gibt einen Binärwert von 1010 oder 1*0 + 2*1 + 4*0 + 8*1 = 10 zurück. Dieser Wert entspricht dem 11. Sprite im Kachelblatt.

Kachelsatzkomplexität

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

Aber was passiert, wenn Sie ein optisch ansprechenderes Terrain schaffen möchten? Sie müssen sich mit der Existenz von Eckplättchen auseinandersetzen, wodurch sich die Anzahl der Sprites von 16 auf 48 erhöht. Das folgende 8-Bit-Bitmaskenbeispiel erfordert acht Boolesche Richtungsprüfungen pro Kachel.

8-Bit-Bitmaske mit Eckkacheln

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 Schicht unter den Geländekacheln. Dies ermöglicht es uns, eine Single-Terrain-Lösung zu verwenden und gleichzeitig die Illusion aufrechtzuerhalten, dass zwei Terrain-Typen kollidieren.

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

Eckfliesen vorstellen

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 eine exponentielle Menge zusätzlicher Arbeit für den Künstler, den Programmierer und das Spiel selbst. Wenn wir das erweitern, was wir aus der 4-Bit-Lösung gelernt haben, können wir schnell verstehen, wie wir uns der 8-Bit-Lösung nähern.

A sprite sheet of an example tilesetA sprite sheet of an example tilesetA sprite sheet of an example tileset

Hier ist das komplette Sprite-Blatt für unsere Geländekacheln am Meer. Merkst du etwas Besonderes an der Anzahl der Kacheln? Das 4-Bit-Beispiel von früher ergab 24 = 16 Kacheln, daher sollte dieses 8-Bit-Beispiel sicherlich 28 = 256 Kacheln ergeben, aber es gibt deutlich weniger als das dort.

Zwar führt diese 8-Bit-Bitmaskenprozedur zu 256 möglichen Binärwerten, doch erfordert nicht jede Kombination eine völlig eindeutige Kachel. Das folgende Beispiel erklärt, wie 256 Kombinationen durch nur 48 Kacheln dargestellt werden können.

8-Bit-Richtungswerte

  • Nordwesten = 20 = 1
  • Norden = 21 = 2
  • Nordosten = 22 = 4
  • West = 23 = 8
  • Ost = 24 = 16
  • Südwesten = 25 = 32
  • Süd = 26 = 64
  • Südosten = 27 = 128
Tile bitmasking 8-bit exampleTile bitmasking 8-bit exampleTile bitmasking 8-bit example

Jetzt führen wir acht boolesche Richtungsprüfungen durch. Die mittlere Kachel oben wird im Norden, Nordosten und Osten von Kacheln begrenzt, sodass diese Boolesche Prüfung einen Binärwert von 00010110 oder 1*0 + 2* 1 + 4*1 + 8*0 + 16*1 + 32*0 + 64*0 + 128*0 = 22 zurückgibt .

Tile bitmasking 8-bit exampleTile bitmasking 8-bit exampleTile bitmasking 8-bit example

Die Kachel links oben ähnelt der vorherigen Kachel, wird aber jetzt auch von Kacheln im Südwesten und Südosten begrenzt. Diese boolesche Richtungsprüfung sollte einen Binärwert von 10110110 oder 1*0 + 2*1 + 4*1 + 8*0 + 16*1 + 32*1 + 64*0 + 128*1 = 182 zurückgeben.

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

Um die Redundanzen zu beseitigen, fügen wir unserer booleschen Richtungsprüfung eine zusätzliche Bedingung hinzu: Wenn wir prüfen, ob angrenzende Eckkacheln vorhanden sind, müssen wir auch in den vier Hauptrichtungen (direkt Nord, Ost, Süd oder West) nach benachbarten Kacheln suchen. .

Beispielsweise wird die Kachel im Nordosten von vorhandenen Kacheln benachbart, während dies bei den Kacheln im Südwesten und Südosten nicht der Fall ist. Dies bedeutet, dass die Kacheln Südwesten und Südosten nicht in die Bitmaskenberechnung einbezogen werden.

Mit dieser neuen Bedingung gibt diese Boolesche Prüfung einen Binärwert von 00010110 oder 1*0 + 2*1 + 4*1 + 8*0 + 16*1 + 32*0 + 64*0 + 128*0 = 22 zurück Vor. Jetzt können Sie sehen, wie die 256 Kombinationen durch nur 48 Kacheln dargestellt werden können.

Tile bestellen

Ein weiteres Problem, das Sie möglicherweise bemerken, besteht darin, dass die durch das 8-Bit-Bitmaskierungsverfahren berechneten Werte nicht mehr mit der Reihenfolge der Kacheln im Sprite-Blatt 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 wir das entsprechende Sprite greifen.

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

In diesem Beispiel suchen 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 Bitmaskenwerten, die sich auf die Positionen der Kacheln in unserem Sprite-Blatt beziehen (Sie können diese Werte in Ihrem Projekt verwenden, um Zeit zu sparen):

1
{ 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 einzelnen Geländetyp aus. Was ist jedoch, wenn wir der Gleichung ein zweites Gelände hinzufügen? Wir brauchen eine 5-Bit-Bitmaskenlösung und müssen unsere beiden Geländetypen definieren. Wir müssen der mittleren Kachel auch 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 nun allseitig von einer weiteren Fliese umgeben sein.

Tile bitmasking 8-bit example with multiple terrain typesTile bitmasking 8-bit example with multiple terrain typesTile bitmasking 8-bit example with multiple terrain types

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

Die mittlere Kachel im obigen Beispiel ist im Norden, Westen und Osten vom Geländetyp 2 und im Süden vom Geländetyp 1 umgeben. Die mittlere Kachel ist Geländetyp 1, wird also nicht gezählt. Diese Boolesche Prüfung gibt einen Binärwert von 00111 oder 1*1 + 2*1 + 4*1 + 8*0 + 16*0 = 7 zurück.

Tile bitmasking 8-bit example with multiple terrain typesTile bitmasking 8-bit example with multiple terrain typesTile bitmasking 8-bit example with multiple terrain types

In diesem Beispiel ist unsere mittlere Kachel Geländetyp 2, daher wird sie bei der Berechnung berücksichtigt. Die mittlere Kachel ist im Norden und Westen von Gelände Typ 2 umgeben. Es ist auch von Gelände Typ 1 im Osten und Süden umgeben. Diese Boolesche Prüfung gibt einen Binärwert von 10011 oder 1*1 + 2*1 + 4*0 + 8*0 + 16*1 = 19 zurück.

Dynamische Implementierung

Die Bitmaskenberechnung kann auch während des Spiels durchgeführt werden, um Änderungen der Platzierung und des Erscheinungsbilds der Kacheln 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 Bitmaskierungsverfahren ist für alle Kacheln obligatorisch, zusätzliche dynamische Berechnungen sollten jedoch nur durchgeführt werden, wenn dies unbedingt erforderlich ist. Beispielsweise würde eine zerstörte Geländekachel die Bitmaskenberechnung nur für umgebende Kacheln auslösen.

Abschluss

Tile Bitmasking ist das perfekte Beispiel für den Aufbau eines funktionierenden Systems, das Sie bei der Spieleentwicklung unterstützt. Es ist nicht etwas, das sich direkt auf die Erfahrung des Spielers auswirkt. Stattdessen bietet diese Methode zur Automatisierung eines zeitaufwändigen Teils des Level-Designs dem Entwickler einen wertvollen Vorteil. Einfach ausgedrückt: Tile Bitmasking ist eine schnelle Möglichkeit, das Spiel dazu zu bringen, Ihre Drecksarbeit zu erledigen, sodass Sie sich auf wichtigere Aufgaben konzentrieren können.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.