在每个游戏循环迭代中调用main.lua脚本 - 是好还是坏设计?它如何影响性能(相对)?
从维护游戏状态一个.C++主机程序或b.来自Lua脚本或c.来自两者并同步它们?
(关于该主题的上一个问题:Lua和C++:职责分离)
(我投票给每个答案.最好的答案将被接受.)
请帮助分类组织C++/Lua游戏代码的方式并分离他们的职责.什么是最方便的方式,你使用哪一种?
例如,Lua可以仅用于初始化C++对象,也可以用于每次游戏循环迭代.它既可以用于游戏逻辑,也可以用于图形.一些游戏引擎提供对脚本中所有子系统的完全控制!我真的不喜欢这种方法(根本没有分离).
将所有游戏对象(npc,位置)实现为没有C++对象的Lua表是一个好主意吗?或者最好镜像它们(Lua表来控制C++对象)?或者是其他东西?
谢谢.
编辑.我的分类:Lua和C++:职责分离.
主题的延续:Lua,游戏状态和游戏循环
我目前正在学习如何使用 Lua C API,虽然我在 C/C++ 和 Lua 之间成功绑定了函数,但我有几个问题:
将多个脚本加载到一个中是个好主意lua_State吗?有没有办法关闭特定的块?如果不再使用脚本,如何lua_State在保留其他所有内容的同时将其清除?
使用可能对函数/全局变量使用相同名称的脚本的最佳方法是什么?如果我加载所有这些,新的定义会覆盖旧的。
在线阅读后,我认为我需要将每个加载的块分离到不同的环境中。我设想的这种工作方式是每次加载一个块时,我都会为它分配一个唯一的环境名称,当我需要使用它时,我只需使用该名称从 中获取环境LUA_REGISTRYINDEX并执行操作。到目前为止,我还没有想出如何做到这一点。网上有例子,但他们使用 Lua 5.1。
如何从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与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)
有任何想法吗?
我一直在寻找一种方法来处理 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 进行错误处理并在控制台中显示消息的正确方法是什么?
我需要在 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)
预期结果:好
感谢您的回答!