Доброго времени суток.
Уже достаточно долгое время мучаюсь с небольшим куском кода. После изучения всяческих способов реализации ООП в луа, решил попробовать сделать его своими силами. И, фактически, все работает, но не так, как мне хотелось бы.
Тут мы раскладываем объекты по какой-то карте, при этом, каждый объект создается для каждой ячейки и индивидуален.
function map_lay()
for y = 1, map_w do
for x = 1, map_h do
local f = NEW(floor) --Создаем новый объект.
f.x = x * f.w -- Вот тут выдает ошибку attempt to index local "f" (nil value)
f.y = y * f.h
map[x][y] = f
end
end
end
Вот тут и сам процесс создания.
function NEW(p) --Определяем тип и сортируем в таблицы для удобной работы с объектами. Ну и да, сама функция создает объект.
o = {}
o.Parent = p.name --На самом деле, я начал проверку отсюда сразу, как только выдало ошибку. Ребенок и правда рождается мертвым, а именно - nil
--Если у объекта есть родитель, передаем ребенка по назначению при помощи метатаблицы.
if o.Parent == nil then
do end
else
function o.Parent:newCreate(o)
setmetatable(o, {__index = o.Parent})
end
end
if o.Type == "tile" then
table.insert(Turfs, o)
o.id = math.random(1, 999999) -- На скорую руку для проверки количества объектов в действительности, а не просто #Turfs, где все объекты вполне могут быть одним единственным.
end
created(o) -- Если создан, выполняется код из функции. Например, отрисовка или логирование.
return o
end end
Сами объекты, чьи, грубо говоря, шаблоны используются в массовом создании.
tile = {
name = tile,
w = 32,
h = 32,
x = 0,
y = 0,
Type = "tile",
Parent,
id
}
--Интересный момент. Если это объявить вместо local f = NEW(floor), получается ровно то, что я и хотел, и все работает (То самое "фактически"). Ну, точнее, если еще и объявлять локально.
floor = {
name = floor,
w = 32,
h = 32,
x = 0,
y = 0,
Type = "tile",
Parent = tile
}
В общем, никак не могу понять, что я делаю не так. Испробовал различные варианты, пытался переписывать, но в итоге nil и все тут. Словно функция NEW() вовсе и не получает никаких таблиц. Вполне может быть, что косяк в какой-нибудь мелочи. У меня так часто бывает.
Пожалуйста, объясните где ошибка и, желательно, почему так происходит? А то который час сижу и пытаюсь понять в чем суть. Уже аж мозги сварились.
Извиняюсь, если подобные вопросы были. Искал, но что-то не нашел.