Ответ 1
Мой подход заключался в том, чтобы максимально ограничить возможности Lua. Я никогда не обнаружил необходимости в "основной" или другой такой функции, которая вызывается каждый раз при рендеринге сцены (или более). Однако некоторые двигатели Lua (например, LOVE) делают это. Я предпочитаю определять объекты с дополнительными функциями обратного вызова для общих событий, которые могут потребоваться для ответа на объект, такие как столкновение, щелчок мышью, ввод или выход из игрового мира и т.д.
Конечный результат является очень декларативным, почти конфигурационным файлом для объектов. У меня есть функция для создания классов или типов объектов, а другая для создания объектов на основе этих типов. Затем объекты имеют набор методов, которые можно вызвать при реагировании на различные события. Все эти методы Lua относятся к методам C/С++, которые, в свою очередь, изменяют частные свойства объекта. Ниже приведен пример объекта bucket, который может захватывать объекты шара:
define {
name='ball';
texture=png('images/orb.png');
model='active';
shape='circle';
radius=16;
mass=1.0;
elastic=.7;
friction=.4;
}
define {
name='bucket';
model='active';
mass=1;
shape='rect';
width=60;
height=52;
texture=png('images/bucket.png');
elastic=.5;
friction=.4;
oncontact = function(self, data)
if data.subject:type() == 'ball' then
local a = data.subject:angleTo(self:getxy())
if a < 130 and a > 50 then
--update score etc..
end
end
end;
}
Я бы не воспринимал это как "один истинный способ" для реализации вашего скриптового API. Одной из красавиц Lua является то, что он поддерживает множество различных типов API. Это то, что я нашел, хорошо работает для игр, которые я делаю - игры на основе 2D-физики.