如何将C++中的对象列表传递给Lua?
2009-5-8 3:11:26
收藏:0
阅读:402
评论:2
我是 Bitfighter 的首席开发人员,正在使用 Lua 添加用户编写的机器人。我使用 C++ 和 Lunar 完成 Lua 的绑定。
我正在尝试做一件我认为应该很简单的事情:在 Lua 中有一个 C++ 对象(下面的代码中的 bot),我调用它的一个方法(findItems),该方法导致 C++ 在机器人周围搜索,并返回一个对象列表(包括 TestItems 和其他在此处未显示的对象)。我的问题很简单,如何在 C++ 中组装并返回发现的项目列表,然后在 Lua 中迭代它们?
基本上,我想要填写下面的 <<<< Create list of items, return it to lua >>>> 块并在 Lua 代码本身中进行必要的更正。
我试图保持代码简单但完整。希望这里没有太多的东西!谢谢!
C++ Header file
class TestItem : public LuaObject
{
public:
TestItem(); // C++ constructor
///// Lua Interface
TestItem(lua_State *L) { } ; // Lua constructor
static const char className[];
static Lunar<TestItem>::RegType methods[];
S32 getClassID(lua_State *L) { return returnInt(L, TestItemType); }
};
class LuaRobot : public Robot
{
LuaRobot(); // C++ constructor
///// Lua Interface
LuaRobot(lua_State *L) { } ; // Lua constructor
static const char className[];
static Lunar<LuaRobot>::RegType methods[];
S32 findItems(lua_State *L);
}
C++ .cpp file
const char LuaRobot::className[] = "Robot"; // Class name in Lua
// Define the methods we will expose to Lua
Lunar<LuaRobot>::RegType LuaRobot::methods[] =
{
method(LuaRobot, findItems),
{0,0} // End method list
};
S32 LuaRobot::findItems(lua_State *L)
{
range = getIntFromStack(L, 1); // Pop range from the stack
thisRobot->findObjects(fillVector, range); // Put items in fillVector
<<<< Create list of items, return it to lua >>>>
for(int i=0; i < fillVector.size(); i++)
do something(fillVector[i]); // Do... what, exactly?
return something;
}
/////
const char TestItem::className[] = "TestItem"; // Class name in Lua
// Define the methods we will expose to Lua
Lunar<TestItem>::RegType TestItem::methods[] =
{
// Standard gameItem methods
method(TestItem, getClassID),
{0,0} // End method list
};
Lua Code
bot = LuaRobot( Robot ) -- This is a reference to our bot
range = 10
items = bot:findItems( range )
for i, v in ipairs( items ) do
print( "Item Type: " .. v:getClassID() )
end
原文链接 https://stackoverflow.com/questions/837772
点赞
stackoverflow用户88888888
这个方法完美地工作。为了澄清给其他读者,这个方法
item->push(L)
实际上是这个样子的
void push(lua_State *L) { Lunar<TestItem>::push(L, this); }
通过将此方法封装在一个函数中,我们可以使得findItems与它寻找的对象无关。
感谢您的帮助!
2009-05-12 08:23:29
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
所以你需要填充一个向量并将其推到 Lua 中。以下是一些示例代码。Applications 是一个 _std::list_。
typedef std::list<std::string> Applications;
我创建了一个表,并用列表中的数据填充它。
int ReturnArray(lua_State* L) { lua_createtable(L, applications.size(), 0); int newTable = lua_gettop(L); int index = 1; Applications::const_iterator iter = applications.begin(); while(iter != applications.end()) { lua_pushstring(L, (*iter).c_str()); lua_rawseti(L, newTable, index); ++iter; ++index; } return 1; }
这将留下一个在堆栈中的数组。如果它返回到 Lua 中,则可以编写以下内容:
for k,v in ipairs( ReturnArray() ) do print(v) end
当然,到目前为止,这只会让我得到一个 Lua 字符串数组。为了获得 Lua 对象数组,我们只需要稍微调整一下你的方法:
S32 LuaRobot::findItems(lua_State *L) { range = getIntFromStack(L, 1); // 从堆栈中弹出范围 thisRobot->findObjects(fillVector, range); // 将项放入 fillVector 中 // <<<< 创建项列表,将其返回到 Lua >>>> lua_createtable(L, fillVector.size(), 0); int newTable = lua_gettop(L); for(int i=0; i < fillVector.size(); i++) { TestItem* item = fillVector[i]; item->push(L); // 将对象(而不是字符串)放入 Lua 数组中 lua_rawseti(L, newTable, i + 1); } return 1; }