You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:30:03