Godot 如何正确删除CollisionShape2D覆盖区域内的TileMap瓦片
问题背景
我需要实现调用指定函数时,自动删除TileMap节点中某个CollisionShape2D覆盖范围内的所有瓦片,最初编写的代码运行后,删除的瓦片区域和CollisionShape2D的实际范围不匹配。
初始代码
func changeArea(collionshape): var corridorTile = $CorridorTiles var rect = Rect2(collionshape.position, collionshape.shape.extents*2) var topleft = corridorTile.world_to_map(rect.position) var bottomright = corridorTile.world_to_map(rect.end) for x in range(topleft.x, bottomright.x): for y in range(topleft.y, bottomright.y): corridorTile.set_cell(x, y, -1)
错误原因
CollisionShape2D的position属性是形状的中心点坐标,初始代码直接将中心点作为Rect2的左上角起点,导致构造的矩形整体偏移了半个形状的尺寸,最终删除区域和实际覆盖区域不匹配。
修正后代码
调整坐标计算逻辑,先通过中心点加减形状半长得到真实的覆盖区域边界,再转换为TileMap的格子坐标进行删除,同时新增位掩码区域更新逻辑保证自动拼接瓦片样式正常:
func changeCorridorTile(collionshape): var corridorTile = $CorridorTiles var extents:Vector2 = collionshape.shape.extents var topleft = corridorTile.world_to_map(collionshape.position - extents) var bottomright = corridorTile.world_to_map(collionshape.position + extents) for x in range(topleft.x, bottomright.x): for y in range(topleft.y, bottomright.y): corridorTile.set_cell(x, y, -1) corridorTile.update_bitmask_region()
内容的提问来源于stack exchange,提问作者WannabeDev
相关产品推荐
相关产品推荐

