0

我正在尝试使用纯 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 (而且它的效率明显低下,但并不是每一帧都调用它),所以它肯定是错误的。我以前从来没有搞过递归,所以任何帮助表示赞赏。

我可以通过将每个值存储在原型中来解决这个问题,但是使用组合就没有意义了,而且我还有很多打字工作要做。

4

1 回答 1

0

重新审视后,我意识到我只想修改汇编表内容的单个副本,因此 deepcopy() 仅在assemble_entity. 在递归调用中创建其嵌套组件的副本是不必要的,因此我将函数调用更改为:

new_ent = deepcopy(assemblage)
new_ent = assemble_entity(new_ent, archetype)

现在它可以工作了

于 2020-06-13T19:05:35.167 回答