如何从泛洪填充算法中删除不可见的单元格



编辑:我终于发现了问题:我在数组中循环时从数组中擦除了元素,这导致for循环中断,因为它会跳过擦除值之后的值。否则,代码和系统将正常工作。为了修复它,我对数组进行了深度复制,并从副本中删除了元素,同时仍在循环浏览原始的

我正在尝试修改我的洪水填充算法(基于网格的游戏(,以便删除玩家看不到的单元格(被碰撞瓦片或其他玩家阻挡(。目前,该算法返回一个数组,其中包含玩家特定范围内的每个单元格

我尝试的解决方案是在返回数组之前,在代码中添加一个光线投射,该光线投射在每个单元格上,检查算法的起始单元格和for循环中的当前单元格之间的冲突。

不过,光线投射不能正常工作,因为光线投射中的is_colliding方法显然没有返回预期的结果,而且细胞似乎是随机移除的。我试着调用force_update_transformforce_raycast_update,但没有解决问题。

我该怎么解决这个问题?我试着使用调试器使碰撞可见,但在循环数组时没有绘制光线投射,所以不幸的是,我看不到它在屏幕上的实际投射位置。它似乎只是随机碰撞(它应该与瓷砖贴图上的瓷砖碰撞,我也尝试过调整碰撞形状,但它没有修复它(

也许我可以在算法中添加另一种解决方案来删除正确的单元格?

这是我的flood fill函数中的代码(它位于函数返回包含单元格的数组之前的末尾(

if tilemap.get_occupied_cells().has(starting_cell):
var current_actor = tilemap.get_occupied_cells()[starting_cell]
raycast.add_exception(current_actor)

raycast.position = tilemap.map_to_world(starting_cell)
raycast.enabled = true
raycast.exclude_parent = false
raycast.collide_with_areas = true
raycast.collide_with_bodies = true
for cell in array:
raycast.position = tilemap.map_to_world(starting_cell) + raycast_offset
raycast.cast_to = tilemap.map_to_world(cell) - raycast.position + raycast_offset

raycast.force_update_transform()
raycast.force_raycast_update()
if raycast.is_colliding():
print(raycast.get_collider().name)
array.erase(cell)

问题出现在for循环中:在循环时从数组中擦除元素会导致问题。我相应地编辑了这篇文章。

最新更新