【发布时间】:2020-05-01 02:47:29
【问题描述】:
我正在使用在 Lua 中实现的游戏制作框架来忙于隔离。我正在使用 ECS/DOP 制作一个简单的平台游戏,我想生成从瓦片地图派生的碰撞几何图形,而不仅仅是检查与所有瓦片的碰撞。
每个图块都有一个边界框组件,它指向一个包含基本形状的列表。每个形状将边界框的边缘存储为 {{x1,y1},{x2,y2}}。此过程的第一步是解析仅包含 tilenames 的 TileMap 表,然后将由 row/column * grid_dimension 转换的相应边界框的副本插入名为 BBOX 的表中。下一步是删除边缘的所有实例,如果它是此图像所示的重复项
这是我卡住的地方。
所需的基本边缘删除算法如下所示:
for i = #BBOX, 1, -1 do
local edge1 = BBOX[i]
for j = i, 1, -1 do
local edge2 = BBOX[j]
same_edge = edge1 == edge2 -- Not the actual comparison, just the outcome of it
if same_edge and i ~= j then
BBOX[i] = nil
BBOX[j] = nil
end
end
end
问题当然是当 i 等于循环中较早删除的 j 时,此错误。我环顾四周,找不到一种方法来删除 lua 中所有重复值的实例,只有关心唯一性的解决方案。有没有人找到一种有效的方法来做这件事或类似的事情?
【问题讨论】:
-
您可以将您的键设置为每条边唯一的值,本质上是您用于比较的键。这将删除重复的值。
-
那么根据边本身的值来做key?这是一个很酷的主意。我将如何去删除重复的最后一个实例呢?我可以看到 BBOX[edge_key] = edge 如何有助于制作唯一值表,但摆脱最后一个唯一值似乎有点麻烦。
-
我不确定我理解你所说的
getting rid of the last unique是什么意思。如果您使用edge_key并假设edge1和edge2相同,那么BBOX[edge1_key] = edge1后跟BBOX[edge2_key] = edge2只是1 个表条目而不是2 个 -
基本上,最后我希望 BBOX[edge2_key] 和 BBOX[edge1_key] 返回 nil。重复边缘意味着它们位于较大矩形的内部(它们将是上图中的虚线)并且需要删除两条边缘。
标签: lua