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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:30:02