36 lines
1.7 KiB
GDScript
36 lines
1.7 KiB
GDScript
## MapPainter.gd
|
|||
|
|
# Responsible for painting the generated map data onto a TileMapLayer in the scene.
|
||
|
|
# Handles both floor and wall tiles, using atlas coordinates for floor variety and terrain peering for walls.
|
||
|
|
class_name MapPainter
|
||
|
|
extends RefCounted
|
||
|
|
|
||
|
|
# The source ID for the floor tile in the TileSet atlas.
|
||
|
|
const FLOOR_SOURCE_ID: int = 0
|
||
|
|
# Two different atlas coordinates for floor tiles, used to create a checkerboard effect for visual variety.
|
||
|
|
const FLOOR_ATLAS_COORDS_1: Vector2i = Vector2i(3, 2)
|
||
|
|
const FLOOR_ATLAS_COORDS_2: Vector2i = Vector2i(4, 2)
|
||
|
|
|
||
|
|
# Terrain set and terrain index for wall tiles, used for Godot's terrain peering system.
|
||
|
|
const WALL_TERRAIN_SET: int = 0
|
||
|
|
const WALL_TERRAIN: int = 0
|
||
|
|
|
||
|
|
# Paints all tiles from the given MapData onto the provided TileMapLayer.
|
||
|
|
# Floors are painted with alternating atlas tiles for variety; walls are collected and painted with terrain peering.
|
||
|
|
func paint(data: MapData, layer: TileMapLayer) -> void:
|
||
|
|
layer.clear() # Remove any existing tiles from the layer.
|
||
|
|
var wall_cells: Array[Vector2i] = [] # Collect wall tile positions for batch painting.
|
||
|
|
|
||
|
|
for coords: Vector2i in data.grid.keys():
|
||
|
|
match data.grid[coords]:
|
||
|
|
MapData.TileType.FLOOR:
|
||
|
|
# Alternate between two floor atlas tiles for a checkerboard effect.
|
||
|
|
var use_first: bool = ((coords.x + coords.y) % 2) == 0
|
||
|
|
var atlas_coords: Vector2i = FLOOR_ATLAS_COORDS_1 if use_first else FLOOR_ATLAS_COORDS_2
|
||
|
|
layer.set_cell(coords, FLOOR_SOURCE_ID, atlas_coords)
|
||
|
|
MapData.TileType.WALL:
|
||
|
|
# Collect wall positions for terrain peering.
|
||
|
|
wall_cells.append(coords)
|
||
|
|
|
||
|
|
# Use Godot's terrain peering to auto-connect wall tiles for seamless edges/corners.
|
||
|
|
layer.set_cells_terrain_connect(wall_cells, WALL_TERRAIN_SET, WALL_TERRAIN, false)
|