我正在尝试使用纯 Lua 表来实现组合的概念。程序集是较大的表,而原型/类是具有匹配键的较小表,用于修改程序集中的默认值。这一直工作正常,但所有组件都位于实体内的同一级别。现在我正在尝试按类别组织组件,如下所示:
archetype = {
physics = {
accel = 100, vel = {50, 50}, jump = 80
},
physics = {}
该集合在物理 ( )下只有一个空表
我组装实体的功能是:
function assemble_entity(assemblage, arch, x, y)
new_ent = deepcopy(assemblage)
for pkey, pvalue in pairs(new_ent) do
for ckey, cvalue in pairs(arch) do
if pkey == ckey then
if type(cvalue) == 'table' then
new_ent[pkey] = deepcopy(cvalue)
else
new_ent[pkey] = cvalue
end
end
end
end
end
(deepcopy 取自 lua 用户 wiki)
但是,因为原型表只包含修改后的值,所以将原型的组件复制到集合中将覆盖集合的默认值。我尝试了递归:
function assemble_entity(assemblage, arch)
new_ent = deepcopy(assemblage)
for pkey, pvalue in pairs(new_ent) do
for ckey, cvalue in pairs(arch) do
if pkey == ckey then
if type(cvalue) == 'table' then
new_ent[pkey] = assemble_entity(pvalue, cvalue)
else
new_ent[pkey] = cvalue
end
end
end
end
return new_ent
end
(只是用 assemble_entity 交换了 deepcopy)
我发现的问题是大多数组件返回 nil (而且它的效率明显低下,但并不是每一帧都调用它),所以它肯定是错误的。我以前从来没有搞过递归,所以任何帮助表示赞赏。
我可以通过将每个值存储在原型中来解决这个问题,但是使用组合就没有意义了,而且我还有很多打字工作要做。