Godot 4 Tilemap tricks
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
## Registers a tile with the tilemap that can then be placed | |
## via tile_map.set_cell(layer_index, map_coord, tile_id, Vector2i(0, 0)) | |
func register_tile_and_get_id(tile_map:TileMap, texture:Texture2D, tile_size:int) -> int: | |
var tileset = tile_map.tile_set | |
var source = TileSetAtlasSource.new() | |
source.texture = texture | |
source.texture_region_size = Vector2i(tile_size, tile_size) | |
source.create_tile(Vector2i(0, 0)) | |
return tileset.add_source(source) | |
## Places an autotile at position x,y (supports list of points) | |
func set_terrain(map_coords:Array[Vector2i]) -> void: | |
tile_map.set_cells_terrain_connect(0, map_coords, 0, 0, true) | |
## Noise texture that comes with its own noise editor in the properties section! | |
@export var noise:FastNoiseLite = FastNoiseLite.new() | |
## Given a terrain on a tileset, this code will generate a cave | |
## (noise may need to betweaked within the editor) | |
func generate_cave(tile_map:TileMap, map_w:int, map_h:int, seed:int, threshold:float) -> void: | |
noise.seed = seed | |
var air_positions:Array[Vector2i] = [] | |
for x in range(-map_w / 2, map_w / 2): | |
for y in range(-map_h / 2, map_h / 2): | |
var tile_id = tile_map.get_cell_source_id(0, Vector2i(x, y), false) | |
# ensure we do not draw on already placed tiles | |
if tile_id != -1: | |
continue | |
var noise_value = noise.get_noise_2d(x, y) | |
elif threshold >= noise_value: | |
air_positions.append(Vector2i(x, y)) | |
set_terrain(air_positions) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment