Lua和C++:职责分离

top*_*dev 11 c++ oop lua modularity lua-c++-connection

请帮助分类组织C++/Lua游戏代码的方式并分离他们的职责.什么是最方便的方式,你使用哪一种?

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

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

谢谢.

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

主题的延续:Lua,游戏状态和游戏循环

Nic*_*unt 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;
}
Run Code Online (Sandbox Code Playgroud)

我不会将其视为实现脚本 API 的“唯一正确方法”。Lua 的优点之一是它支持许多不同风格的 API。这正是我发现的非常适合我制作的游戏的方法——基于 2D 物理的游戏。