Я пытаюсь реализовать концепцию сборок с использованием чистых таблиц 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)

Однако, поскольку таблица архетипа содержит только измененные значения, копирование компонентов архетипа в сборку перезапишет значения сборки по умолчанию. Я попробовал свои силы в рекурсии:

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

(просто заменил deepcopy на build_entity)

Проблема, которую я обнаружил, заключается в том, что большинство компонентов возвращают ноль (и это явно неэффективно, но не вызывается в каждом кадре), поэтому это определенно неверно. Я никогда раньше не связывался с рекурсией, поэтому приветствую любую помощь.

Я мог бы просто решить эту проблему, сохраняя каждое значение в архетипах, но тогда не было бы смысла использовать сборки, и мне пришлось бы много печатать впереди.

0
Optimum 13 Июн 2020 в 00:15

1 ответ

Лучший ответ

После свежего взгляда на это я понял, что хочу изменить только одну копию содержимого таблицы сборки, поэтому deepcopy () необходим только на первой итерации assemble_entity. Создавать копию вложенных компонентов в рекурсивных вызовах не нужно, поэтому я изменил вызов функции на:

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

И теперь это работает

0
Optimum 13 Июн 2020 в 19:05