如何将Lua变量直接映射到C++;变量 我正在用C++语言编写一个游戏引擎,用Lua来定义NPC。

如何将Lua变量直接映射到C++;变量 我正在用C++语言编写一个游戏引擎,用Lua来定义NPC。,c++,variables,pointers,mapping,lua,C++,Variables,Pointers,Mapping,Lua,我可以这样定义一个原型NPC: orc = { name = "Generic Orc", health = 100 } function orc:onIdle() print("Orc idles...") end local myOrc = entitySpawn(orc) local curHealth = getEntityHealth(myOrc) setEntityHealth(myOrc, curHealth + 10) 然后使用entitySpawn

我可以这样定义一个原型NPC:

orc =
{
    name = "Generic Orc",
    health = 100
}

function orc:onIdle()
    print("Orc idles...")
end
local myOrc = entitySpawn(orc)
local curHealth = getEntityHealth(myOrc)
setEntityHealth(myOrc, curHealth + 10)
然后使用
entitySpawn(Orc)
生成一个“Orc”实例。这是一个C++函数,它从给定表中读取像健康和名称这样的值,用给定的值在C++中创建一个实体对象,并且为特定的NPC创建一个LUA表。

现在,我想在Lua中的Orac.Health变量和C++中对应的实体对象的 Mealth>成员变量之间有直接的联系,这样我就可以在Lua赋值,并在C++中立即使用它,反之亦然。


这可能吗?还是必须使用setter/getter函数?我已经查看了光用户数据,并在Lua中存储指向C++变量的指针,但不能赋值。

< P>我没有时间给你任何代码,但请记住 ORC。也就是说,
orc
是一个表,
“health”
是一个元素


记住这一点,您可以更改表的
索引
新索引
,以拥有自己的特定行为。将“真实”orc实例存储为一些私有元数据,然后使用它进行更新。

这是可能的。我假设 EntItPyAsNe< /Cord>返回C++为实体创建的表。我还假定您可以从C++中公开一个函数,该函数使用实体表并返回当前的健康,并与设置类似。(可以使用C++用户对象的轻USEDATA指针作为这个表的成员来实现这个)。 所以丑陋的方式是这样的:

orc =
{
    name = "Generic Orc",
    health = 100
}

function orc:onIdle()
    print("Orc idles...")
end
local myOrc = entitySpawn(orc)
local curHealth = getEntityHealth(myOrc)
setEntityHealth(myOrc, curHealth + 10)
为了使它更漂亮,我们可以使用元表来获得一些乐趣。首先,我们将为所有我们关心的属性放置访问器

entityGetters = {
    health = getEntityHealth,
    -- ...
}
entitySetters = {
    health = setEntityHealth,
    -- ...
}
然后,我们将创建一个使用这些函数来处理属性分配的

entityMetatable = {}

function entityMetatable:__index(key)
    local getter = entityGetters[key]
    if getter then
        return getter(self)
    else
        return nil
    end
end

function entityMetable:__newindex(key, value)
    local setter = entitySetters[key]
    if setter then
        return setter(self, value)
    end
end
现在您需要让
entitySpawn
分配元表。您可以使用该函数执行此操作

int entitySpawn(lua_State* L)
{
    // ...
    // assuming that the returned table is on top of the stack
    lua_getglobal(L, "entityMetatable");
    lua_setmetatable(L, -2);
    return 1;
}
现在你可以用很好的方式来写了:

local myOrc = entitySpawn(orc)
myOrc.health = myOrc.health + 10
请注意,这要求
entitySpawn
返回的表未设置运行状况属性。如果是这样,则永远不会为该属性查询元表


C++可以创建<代码> >“ItgTigter”>代码>“ItTyTestStuts,和ItTyMeMataby表,以及看来我的研究方向完全错了:)