Lua和C ++:职责分离

时间:2010-04-20 11:01:07

标签: c++ oop lua modularity lua-c++-connection

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

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

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

谢谢。

修改。我的分类: Lua and C++: separation of duties

主题的延续: Lua, game state and game loop

3 个答案:

答案 0 :(得分:4)

我的方法是尽可能限制暴露于Lua的内容。我从未发现需要一个“主”或其他这样的函数,每次渲染场景(或更多)时都会调用它。然而,一些Lua引擎(如LOVE)会这样做。我更喜欢为您可能希望对象响应的常见事件定义具有可选回调函数的对象,例如碰撞,鼠标单击,进入或离开游戏世界等。

最终结果是非常声明的,几乎是对象的配置文件。我有一个用于创建对象类或类型的函数,另一个用于基于这些类型创建对象。然后,对象具有一组方法,可以在响应各种事件时调用这些方法。所有这些Lua方法都映射到C / C ++方法,而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。这正是我发现的对我制作的游戏 - 二维物理游戏。

答案 1 :(得分:2)

我建议这种分类:

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

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

  3. Lua脚本很少用于初始化,配置和回调。主机程序为脚本提供(绑定)非常简约的接口。所以脚本是通过精心设计和提供的块构建的。

答案 2 :(得分:1)

从小处开始。允许访问游戏实体,以便您可以执行特定于地图/级别的脚本。跨地图/级别一致的行为可能不需要编写脚本。

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