Skip to content

Динамическое создание объектов

Обычные объекты и комнаты нельзя создавать "на лету". Обычно вы создаёте их в глобальном пространстве lua файла. Однако, существуют игры, в которых количество объектов неизвестно заранее, или количество объектов велико, и они добавляются по ходу игры.

В INSTEAD существует способ создания любого объекта на лету. Для этого вам понадобится написать конструктор вашего объекта и воспользоваться функцией 'new'.

Конструктор должен быть декларирован.

Итак, вы можете использовать функции 'new' и 'delete' для создания и удаления динамических объектов. Примеры:

lua
declare 'box' (function()
	return obj {
		dsc = [[Тут лежит {коробка}.]];
		tak = [[Я взял коробку.]];
	}
end)

local o = new (box);
take(o);
lua
declare 'box' (function(dsc)
	return obj {
		dsc = dsc;
		tak = [[Я взял коробку.]];
	}
end)
take(new(box, 'В углу стоит {коробка}'))

'new' воспринимает первый аргумент -- как задекларированную функцию-конструктор, а все остальные параметры -- как аргументы конструктору. Результатом выполнения конструктора должен быть объект.

lua
function myconstructor()
	local v = {}
	v.disp = 'тестовый объект'
	v.act = 'Тестовая реакция'
	return obj(v)
end

Внимание! При создании объекта конструктор должен опираться только на информацию, полученную из параметров! Дело в том, что создание объекта при загрузке происходит в самом начале, когда окружение мира ещё не загружено полностью! В качестве параметров поддерживаются простые типы: строки, таблицы, числа, булевые значения. Недекларированные функции и списки не будут работать.

Если вы хотите уничтожить объект по его имени или ссылке-переменной, воспользуйтесь:

lua
	purge(o) -- удалить из всех списков
	delete(o) -- освободить объект

При этом, delete это именно удаление объекта из INSTEAD, а не аналог remove() или purge(). Обычно, нет особого смысла делать delete. Только если предмет больше никогда не понадобится в игре, или вы собираетесь пересоздать объект с тем же именем, имеет смысл освободить его с помощью delete().

Более практически-полезный пример:

lua
-- декларируем конструктор
-- path

declare 'make_path' (function(v) return path(v) end)

-- динамический переход
-- создали новый объект
-- и положили его в ways()

put( new (make_path, { 'переход', 'комната2'}, ways())