12

请帮助对组织 C++/Lua 游戏代码的方式进行分类并区分它们的职责。最方便的方法是什么,你用哪一种?

例如,Lua 可以仅用于初始化 C++ 对象,也可以在每次游戏循环迭代时使用。它可以仅用于游戏逻辑,也可以用于图形。一些游戏引擎可以完全控制脚本中的所有子系统!我真的不喜欢这种方法(根本没有分离)。

将所有游戏对象(npc、位置)实现为没有 C++ 对象的 Lua 表是一个好主意吗?或者最好是镜像它们(控制 C++ 对象的 Lua 表)?或者是其他东西?

谢谢你。

编辑。我的分类:Lua 和 C++:职责分离

话题继续:Lua、游戏状态和游戏循环

4

3 回答 3

4

我的方法是尽可能限制暴露给 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 物理的游戏。

于 2010-04-21T15:47:32.080 回答
2

我提出这个分类:

  1. 极端变体:Lua 脚本控制一切(游戏逻辑、图形、AI 等)。甚至更多:脚本作为主机程序工作,拥有游戏循环。有些引擎会做这样的事情。坏事:根本没有职责分离,也没有脚本安全。

  2. Lua 脚本维护游戏状态并处理游戏逻辑。可能在每次游戏循环迭代时调用脚本。

  3. Lua 脚本很少用于初始化、配置、回调。宿主程序为脚本提供(绑定)一个非常简约的界面。所以脚本是由这些精心设计和提供的块构建的。

于 2010-04-21T18:50:04.760 回答
1

从小处着手。允许访问游戏实体,以便您可以执行特定于地图/关卡的脚本。跨地图/关卡一致的行为可能不需要脚本。

此外,只允许访问对象的公共接口。

于 2010-04-21T15:07:06.243 回答