這是可能的。我假設entitySpawn
返回C++爲實體創建的表。我還假設您可以公開從C++函數接受一個實體的表,然後返回當前的健康,同樣的設置。 (您可以使用光用戶數據指向C++對象作爲此表的成員來實現這一點。)
因此,醜陋的方式是這樣的:
local myOrc = entitySpawn(orc)
local curHealth = getEntityHealth(myOrc)
setEntityHealth(myOrc, curHealth + 10)
爲了使這個漂亮,我們可以與metatables有一些樂趣。首先,我們將爲我們關心的所有屬性添加訪問器。
entityGetters = {
health = getEntityHealth,
-- ...
}
entitySetters = {
health = setEntityHealth,
-- ...
}
然後我們將創建一個使用這些函數處理屬性分配的metatable。
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
賦值metatable。你可以用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
返回餐桌的現象確實不有一個健康的屬性集。如果是這樣,那麼該物業將永遠不會諮詢metatable。
可以創建entityGetters
,entitySetters
和entityMetatable
表,以及在__index
和__newindex
元方法,在C++而不是Lua中如果感覺清潔給你,但總的想法是一樣的。
謝謝,這就是我需要的!似乎我的研究走向了完全錯誤的方向:) – Daerst 2011-06-09 20:11:42