Lua与C++:职责分离

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

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

将所有游戏对象(npc、位置)实现为 Lua 表格而不是 C++ 对象是一个好主意吗?还是最好将它们映射到(Lua 表格以控制 C++ 对象)?还是其他什么?

谢谢。

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

主题的继续:**Lua, 游戏状态和游戏循环**。

原文链接 https://stackoverflow.com/questions/2674462

点赞
stackoverflow用户193778
stackoverflow用户193778

开始小型化。允许访问游戏实体,以便执行特定于地图 / 关卡的脚本。跨地图 / 关卡保持一致的行为可能不需要编写脚本。

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

2010-04-21 15:07:06
stackoverflow用户30470
stackoverflow用户30470

我的方法是尽可能限制 Lua 可访问的内容。我从未发现过需要一个类似于“main”之类的函数,每次渲染场景(或更多时)都需要调用。一些 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-21 15:47:32
stackoverflow用户288406
stackoverflow用户288406

我建议这样分类:

  1. 极端变种:Lua 脚本控制一切(游戏逻辑、图形、人工智能等)。更甚的是:脚本作为主程序,拥有游戏循环。一些引擎会这么做。最坏的情况:完全没有分工,也没有脚本安全性。

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

  3. Lua 脚本很少用于初始化、配置、回调。主程序为脚本提供(绑定)极简接口。因此脚本是由这些精心设计和提供的模块构建而成。

2010-04-21 18:50:04