TileMap: detecting tiles
Problem
You have a KinematicBody2D
character colliding with a TileMap
, and you want to know which tile it collided with.
Solution
When a KinematicBody2D
collides, the collision data is returned in a KinematicCollision2D
object. The TileMap
acts as a single collider, so if you reference the collider
property, it will be the TileMap
node.
You then need to find out which tile in the TileMap
is at the collision location.
Assume you’ve obtained a KinematicCollision2D
object stored in the variable collision
:
# Confirm the colliding body is a TileMap
if collision.collider is TileMap:
# Find the character's position in tile coordinates
var tile_pos = collision.collider.world_to_map(position)
# Find the colliding tile position
tile_pos -= collision.normal
# Get the tile id
var tile_id = collision.collider.get_cellv(tile_pos)
Once you have the tile_id
, you can get the tile properties from the TileSet
resource, found in the TileMap
’s tile_set
property. For example, to get the name of the tile:
var tile_name = collision.collider.tile_set.tile_get_name(tile_id)
You can also change the tile by setting it to a new id
:
collision.collider.set_cellv(tile_pos, new_id)