gpt4 book ai didi

c++ - 如何将对象列表从 C++ 传递到 Lua?

转载 作者:IT老高 更新时间:2023-10-28 23:19:11 25 4
gpt4 key购买 nike

我是 Bitfighter 的首席开发人员,并且正在使用 Lua 添加用户脚 native 器人。我正在使用 C++ 和 Lua 使用 Lunar 将它们粘合在一起。

我正在尝试做一些我认为应该非常简单的事情:我在 Lua 中有一个 C++ 对象(下面的代码中的机器人),我在它上面调用了一个方法(findItems),它导致 C++ 搜索机器人周围的区域并返回它找到的对象列表(TestItems 和其他未在此处显示的对象)。我的问题只是如何在 C++ 中组装并返回找到的项目列表,然后在 Lua 中对其进行迭代?

基本上,我想填写 <<<< 创建项目列表,将其返回到下面的 lua >>>> block ,并在 Lua 代码本身中进行我可能需要的任何更正,包括在下面。

我试图让代码保持简单但完整。希望这里没有太多!谢谢!

C++ 头文件

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 文件

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 代码

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

最佳答案

所以你需要填充一个 vector 并将其推送到 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

当然,到目前为止,这只是给我一个 strings 的 Lua 数组。要获得 Lua objects 的数组,我们只需稍微调整一下您的方法:

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 >>>>

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); // put an object, not a string, in Lua array
lua_rawseti(L, newTable, i + 1);
}
return 1;
}

关于c++ - 如何将对象列表从 C++ 传递到 Lua?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/837772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com