我的方法是尽可能限制暴露给 Lua 的内容。我从来没有发现每次渲染场景(或更多)时都会调用“主”或其他此类函数。然而,一些 Lua 引擎(如 LOVE)会这样做。我更喜欢为您可能希望对象响应的常见事件(例如碰撞、鼠标单击、进入或离开游戏世界等)定义具有可选回调函数的对象。
最终结果是非常声明性的,几乎是对象的配置文件。我有一个用于创建对象的类或类型的功能,还有一个用于基于这些类型创建对象的功能。然后,这些对象具有一组方法,可以在响应各种事件时调用这些方法。所有这些 Lua 方法都映射到 C/C++ 方法,这些方法反过来修改对象的私有属性。这是一个可以捕获球对象的桶对象示例:
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 物理的游戏。