Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Build and edit tile-based 2D levels in Godot 4.3+ with TileMapLayer and TileSet: paint layers, set up collision/navigation/custom-data on tiles, autotile with terrain sets, and read/write cells from code (set_cell, get_cell_tile_data, local_to_map). Use when working with TileMapLayer nodes, .tres TileSets, autotiling, or migrating a deprecated TileMap node to TileMapLayer.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | -1% | 0% |
| case-07 | ✓→✓ | = Same ✓ | 50% | 0% |
| case-08 | ✓→✓ | = Same ✓ | 59% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 10% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 47% | 0% |
Author tile-based levels with TileMapLayer + TileSet, add per-tile collision and custom data, autotile with terrains, and manipulate cells at runtime. Targets Godot 4.3+, where TileMapLayer replaces the now-deprecated TileMap node.
TileSet (collision,navigation, custom data, terrains), or reading/writing tiles from code.
TileMap node (single node, many layers) to multipleTileMapLayer nodes (one layer each).
When not to use: moving the player across the tiles → godot-2d-movement; general physics bodies/raycasts → godot-physics; procedural map generation algorithms → procedural-gen; level design practice → level-design.
TileMapLayer node (one per visual/logical layer: background, walls,foreground). Each holds exactly one layer of tiles.
TileSet on the layer's tile_set property. Add an atlassource (a texture sliced into tiles) in the TileSet editor. Save the TileSet as an external .tres so multiple layers/levels reuse it.
navigation layers, occlusion, and custom data layers (typed per-tile values like damage or is_ladder).
connecting tiles, define a terrain set and paint with Connect/Path mode.
collision_enabled /navigation_enabled properties.
local_to_map, set_cell, get_cell_source_id, andget_cell_tile_data(...).get_custom_data(...).
gdscriptextends TileMapLayer func _unhandled_input(event: InputEvent) -> void: if event is InputEventMouseButton and event.pressed: # local_to_map expects local coords; convert from global first. var cell := local_to_map(to_local(event.position)) var data := get_cell_tile_data(cell) # TileData or null if data: var dmg: int = data.get_custom_data("damage") # custom data layer print("Cell %s deals %d damage" % [cell, dmg])
gdscript# set_cell(coords, source_id, atlas_coords, alternative_tile = 0) func place_wall(cell: Vector2i) -> void: set_cell(cell, 0, Vector2i(2, 1)) # source 0, atlas tile at column 2, row 1 func dig(cell: Vector2i) -> void: erase_cell(cell) # same as set_cell(cell, -1) func clear_level() -> void: clear() # remove every tile on this layer
gdscript# Paint a filled area with terrain `terrain` of terrain set `terrain_set`; # Godot picks the correct edge/corner tiles to connect them. func fill_with_grass(cells: Array[Vector2i]) -> void: var terrain_set := 0 var grass_terrain := 0 set_cells_terrain_connect(cells, terrain_set, grass_terrain, true)
gdscriptfunc find_spawns() -> Array[Vector2i]: var spawns: Array[Vector2i] = [] for cell in get_used_cells(): var data := get_cell_tile_data(cell) if data and data.get_custom_data("is_spawn"): spawns.append(cell) return spawns
TileMap node is deprecated in 4.3. Use TileMapLayer nodes (one layer per node);group them under a parent Node2D. Old TileMap calls that took a layer argument (set_cell(layer, ...)) do not apply to TileMapLayer.
local_to_map needs local coordinates. Mouse/global positions must be convertedwith to_local(...) first, or cells will be offset.
get_cell_tile_data returns null for empty cells or non-atlas sources — alwaysnull-check before get_custom_data.
int returns int; reading it as thewrong type or referencing a non-existent layer name errors. Define the layer in the TileSet first.
set_cells_terrain_connect produces oddresults if the TileSet's terrain bitmask peering is incomplete.
immediately after set_cell, call update_internals() (expensive — avoid in loops).
collision_enabled, that the tile has aphysics layer with a polygon, and that the TileSet's physics layer mask matches your bodies.
bitmasks), scene tiles, Y-sorting, and runtime tile-data overrides (_use_tile_data_runtime_update), read references/tileset-and-terrains.md.
godot-2d-movement — characters that walk on these tiles.godot-physics — collision layers/masks the tile collisions participate in.procedural-gen — generating tilemaps from noise/RNG.level-design / roguelike — design practice and grid-based genres.Other measured skills in the registry, with their headline benchmark lift.