【问题标题】:Godot - Change tiles within an areaGodot - 改变区域内的瓷砖
【发布时间】:2021-09-05 10:28:15
【问题描述】:

我正在尝试这样做,如果一个函数被称为 Collisionshape2D 覆盖的区域,则会在 TileMap 节点中删除它的图块。我的问题是删除的区域与 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)

编辑1*

将代码更改为:

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()

collisionShape2D 区域覆盖的tileMap 中的单元格被删除。我使用 .bitmask_region() 方法更新它们。

【问题讨论】:

    标签: godot gdscript


    【解决方案1】:

    我注意到的第一件事是,从我的头顶:Rect2 位置是一个角落,但 CollisionShape 位置是中心。

    你必须这样做:

    var extents:Vector2 = collionshape.shape.extents
    var rect := Rect2(collionshape.position - extents, extents * 2)
    

    现在,再看一遍,您根本不需要 Rect2

    var extents:Vector2 = collionshape.shape.extents
    var topleft = corridorTile.world_to_map(collionshape.position - extents)
    var bottomright = corridorTile.world_to_map(collionshape.position + extents)
    

    还有一件事:我相信这是在CollisionShape2D 的父级的本地空间中(我猜是Area2D)。因此,如果这不起作用,可能是因为您需要在全局空间中执行此操作。希望您没有任何旋转(这只会弄乱整个事情)或缩放,所以这只是使用global_position 的问题。


    附录:我忘了一件事,world_to_map 不带全局坐标。试试这个(假设没有旋转或缩放):

    var extents:Vector2 = collionshape.shape.extents
    var position := corridorTile.to_local(collionshape.global_position)
    var topleft = corridorTile.world_to_map(position - extents)
    var bottomright = corridorTile.world_to_map(position  + extents)
    

    【讨论】:

    • 正如您所说,我尝试使用 Rect2 将其复杂化,而且我没有考虑该区域的位置在中心的事实。使用 vector2 删除了 CollisionShape2D 周围的单元格。我的代码与您附录中的代码略有不同,如果我错了,请纠正我,但 world_to_map 应该给出collisionShape2D 的全球位置,所以corridorTile.world_to_map(collionshape.position -/+ extents) 工作得很好,谢谢你帮助我!
    • @WannabeDev world_to_map 为您提供TileMap 中的职位。它采用本地位置,请参阅world_to_map - 我假设在您的情况下,CollisionShape2D 的本地坐标与TileMap 匹配 - 它几乎除以单元格大小和舍入 (source)。另见(Godot Engine) Fill an 2D Polygon with Tilemap tiles
    • 我刚刚检查过,CollisionShape2D 的位置确实与您所说的 TileMap 匹配。我会把这个放在我的笔记中,以防将来我需要使用world_to_map 来操作平铺地图
    猜你喜欢
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多