Это возможно. Я предполагаю, что entitySpawn
возвращает таблицу, созданную C ++ для сущности. Я также предполагаю, что вы можете предоставить функцию из C ++, которая берет таблицу сущности и возвращает текущее состояние, а также аналогично для установки. (Вы можете использовать легкий указатель пользовательских данных на объект C ++ в качестве члена этой таблицы для реализации этого.)
Итак, уродливый путь будет выглядеть так:
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
назначить метатабельный. Это можно сделать с помощью функции lua_setmetatable
.
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
, не было установлено свойство работоспособности. Если это произойдет, то для метатаблицы никогда не будут проводиться консультации для этого свойства.
Вы можете создавать таблицы entityGetters
, entitySetters
и entityMetatable
, а также метаметоды __index
и __newindex
в C ++ вместо Lua, если вам это кажется чище, но общая идея такова: то же самое.