Godot中合并多个相同TileMap的单元格坐标转换问题求助
问题排查与修复方案
核心错误原因
你代码中的问题出在坐标转换逻辑:get_used_cells_by_id返回的是TileMap的单元格坐标(单位为瓦片格数),而to_global/to_local方法处理的是场景像素坐标,二者单位不匹配,直接转换得到的位置完全错误,才会出现瓦片错位割裂的情况。
房间割裂效果如下图:
修正后代码
你需要先把单元格坐标转为对应TileMap的本地像素坐标,再做全局/本地转换,最后换算回主TileMap的单元格坐标即可:
func updateDungeonTileMap(): var maintileMap = $TileMap var cell_size = maintileMap.cell_size var tileMapID:Array = [0, 1, 2] var roomCheck:Array = $Rooms.get_children() for tile_id in tileMapID: for room in roomCheck: var roomTileMap = room.getTileMap() var cells:Array = room.getTileMapCells(tile_id) for cell in cells: # 单元格坐标转房间TileMap本地像素坐标 var room_pixel = cell * cell_size # 转全局像素坐标 var global_pixel = roomTileMap.to_global(room_pixel) # 转主TileMap本地像素坐标 var main_pixel = maintileMap.to_local(global_pixel) # 像素坐标转主TileMap单元格坐标,取整避免精度误差 var main_cell = Vector2( round(main_pixel.x / cell_size.x), round(main_pixel.y / cell_size.y) ) maintileMap.set_cell(main_cell.x, main_cell.y, tile_id) for room in roomCheck: room.removeTileMap() maintileMap.update_bitmask_region()
额外注意事项
- 确认所有房间的TileMap和主TileMap的
tile_set、cell_size、cell_origin属性完全一致,避免出现适配问题 - 如果是Godot 4.x版本,
update_bitmask_region方法已废弃,替换为调用update_dirty_quadrants()即可
内容的提问来源于stack exchange,提问作者Sacul
相关产品推荐
相关产品推荐

