Я пытаюсь реализовать концепцию сборок с использованием чистых таблиц 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)
Проблема, которую я обнаружил, заключается в том, что большинство компонентов возвращают ноль (и это явно неэффективно, но не вызывается в каждом кадре), поэтому это определенно неверно. Я никогда раньше не связывался с рекурсией, поэтому приветствую любую помощь.
Я мог бы просто решить эту проблему, сохраняя каждое значение в архетипах, но тогда не было бы смысла использовать сборки, и мне пришлось бы много печатать впереди.
1 ответ
После свежего взгляда на это я понял, что хочу изменить только одну копию содержимого таблицы сборки, поэтому deepcopy () необходим только на первой итерации assemble_entity
. Создавать копию вложенных компонентов в рекурсивных вызовах не нужно, поэтому я изменил вызов функции на:
new_ent = deepcopy(assemblage)
new_ent = assemble_entity(new_ent, archetype)
И теперь это работает
Похожие вопросы
Новые вопросы
lua
Lua - мощный, быстрый, легкий, встраиваемый язык сценариев. Он динамически типизирован, выполняется путем интерпретации байт-кода и имеет автоматическую сборку мусора. Его скорость - одна из главных причин, по которой он широко используется сообществом машинного обучения. Его часто называют «расширяемым языком расширения».