标签: lua-c++-connection

Lua,游戏状态和游戏循环

  1. 在每个游戏循环迭代中调用main.lua脚本 - 是好还是坏设计?它如何影响性能(相对)?

  2. 从维护游戏状态一个.C++主机程序或b.来自Lua脚本或c.来自两者并同步它们?

(关于该主题的上一个问题:Lua和C++:职责分离)

(我投票给每个答案.最好的答案将被接受.)

c++ lua game-loop lua-c++-connection

22
推荐指数
7
解决办法
1万
查看次数

Lua和C++:职责分离

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

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

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

谢谢.

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

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

c++ oop lua modularity lua-c++-connection

11
推荐指数
1
解决办法
3241
查看次数

在Lua表中注册C函数

如何在Lua中注册C函数,但不是在全局上下文中,而是作为表字段?

c++ lua lua-c++-connection

10
推荐指数
2
解决办法
9689
查看次数

单个 Lua 状态下的多个脚本并使用 _ENV

我目前正在学习如何使用 Lua C API,虽然我在 C/C++ 和 Lua 之间成功绑定了函数,但我有几个问题:

  1. 将多个脚本加载到一个中是个好主意lua_State吗?有没有办法关闭特定的块?如果不再使用脚本,如何lua_State在保留其他所有内容的同时将其清除?

  2. 使用可能对函数/全局变量使用相同名称的脚本的最佳方法是什么?如果我加载所有这些,新的定义会覆盖旧的。

    在线阅读后,我认为我需要将每个加载的块分离到不同的环境中。我设想的这种工作方式是每次加载一个块时,我都会为它分配一个唯一的环境名称,当我需要使用它时,我只需使用该名称从 中获取环境LUA_REGISTRYINDEX并执行操作。到目前为止,我还没有想出如何做到这一点。网上有例子,但他们使用 Lua 5.1。

lua lua-c++-connection lua-api c++11

5
推荐指数
1
解决办法
3781
查看次数

如何使用名称C-API创建Lua表

如何从C-API创建Lua表,如下所示:

TableName = {a, b, c}
Run Code Online (Sandbox Code Playgroud)

如何设置表名?我只知道如何创建表和put值,但不知道如何设置表的名称.

创建没有名称的表的代码:

lua_createtable(L, 0, 3);

lua_pushnumber(L, 1);
lua_setfield(L, -2, "a");

lua_pushnumber(L, 2);
lua_setfield(L, -2, "b");

lua_pushnumber(L, 3);
lua_setfield(L, -2, "c");
Run Code Online (Sandbox Code Playgroud)

lua lua-c++-connection lua-api lua-table

5
推荐指数
1
解决办法
674
查看次数

luaL_dostring什么都不放在堆栈上?

我正在尝试学习Lua与C++接口的基础知识,但我遇到了一个问题.我想调用一个返回字符串的函数,然后使用C++端的字符串,但是luaL_dostring似乎没有在Lua堆栈上放任何东西.

即使是简单的测试似乎也不能正常工作:

lua_State* lua = lua_open();
luaL_openlibs(lua);

//Test dostring.
luaL_dostring(lua, "return 'derp'");

int top = lua_gettop(lua);
cout << "stack top is " <<top << endl;

//Next, test pushstring.
lua_pushstring(lua, "derp");

top = lua_gettop(lua);
cout << "stack top is " << top << endl;
Run Code Online (Sandbox Code Playgroud)

输出:

stack top is 0
stack top is 1
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

c++ lua lua-c++-connection

4
推荐指数
1
解决办法
2214
查看次数

如何使用 Lua 的 C API 在控制台中打印错误

我一直在寻找一种方法来处理 Lua 的 C API 错误,并在控制台中简单地将它们打印出来。虽然,我无法找到一个单一的工作示例。我想做的就是:

static int test(lua_State *L)
{
  if(!lua_isstring(L, 1))
     return luaL_error(L, "This is not a valid string");    
}
Run Code Online (Sandbox Code Playgroud)

或者

static int test(lua_State *L)
{
    try
    {
        if (!lua_isstring(L, 1))
        {
            throw luaL_error(L, "This is not a valid string");
        }
    }
    catch (int e)
    {
        std::cout << "Error " << e << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

但到目前为止,还没有任何效果。使用 LUA C API 进行错误处理并在控制台中显示消息的正确方法是什么?

c c++ error-handling lua lua-c++-connection

4
推荐指数
2
解决办法
2831
查看次数

如何使用 C-API 在 Lua 5.1 中的表中创建表?

我需要在 Lua 5.1 C-API 中创建这样的结构,而不是在 Lua 5.2 及更高版本中

a = {["b"] = {["c"] = {["d"] = {["e"] = "GOOD"}}}}

print(a.b.c.d.e);
Run Code Online (Sandbox Code Playgroud)

预期结果:好

感谢您的回答!

lua-c++-connection lua-5.1

3
推荐指数
1
解决办法
2619
查看次数