在使用TileMap时,通常需要使用 CollisionPolygon2D 来规范玩家的可活动范围,这是比较麻烦的。这里试图用两种方法来自动规范,减少无效工作。特别是你有多个场景时。
-
根据玩家位置自动判断地图块
-
添加掩码图层自动判断可行区域
-
其它相关代码
这是方法1获取相关信息的相关代码
# 获取 CharacterBody2D 的全局坐标
var character_position = player.global_position
# 将全局坐标转换为 TileMap 的局部坐标
var tilemap_position = tilemap.to_local(character_position)
# 将局部坐标转换为地图块坐标
var tile_coords = tilemap.local_to_map(tilemap_position)
# 打印调试信息
print("角色全局坐标: ", character_position)
print("TileMap 局部坐标: ", tilemap_position)
print("地图块坐标: ", tile_coords)
# 检查 TileMap 的 tile_set 是否设置
if tilemap.tile_set == null:
#print("TileMap 的 tile_set 未设置!")
else:
#print("TileMap 的 tile_set 已设置。")
#print("图块大小: ", tilemap.tile_set.tile_size)
# 检查图层是否启用
for layer in range(tilemap.get_layers_count()):
print("图层 ", layer, " 是否可见: ", tilemap.is_layer_enabled(layer))
# 获取 TileMap 的边界
var map_rect = tilemap.get_used_rect()
# 检查坐标是否在地图范围内
if map_rect.has_point(tile_coords):
# 遍历所有图层,检查地图块信息
for layer in range(tilemap.get_layers_count()):
var tile_source_id = tilemap.get_cell_source_id(layer, tile_coords)
var tile_atlas_coords = tilemap.get_cell_atlas_coords(layer, tile_coords)
var layer_name = tilemap.get_layer_name(layer)
if tile_source_id != -1:
print("图层 ", layer, " ", layer_name, " 的地图块 Source ID: ", tile_source_id, " 地图块图集坐标: ",tile_atlas_coords)
else:
print("角色坐标超出地图范围!")