[英]LuaBind: How to bind specific instance of class to Lua?
(旁注:這是游戲編程)
使用LuaBind將整個類綁定到Lua很容易:
class test
{
test()
{
std::cout<<"constructed!"<<std::endl;
}
void print()
{
std::cout<<"works!"<<std::endl;
}
}
//別的地方
module[some_lua_state]
[
class_<test>("test")
.def(constructor<>())
.def("print",&test::print)
];
現在我可以在Lua中創建該類的實例並使用它:
lua_example.lua
foo = test() //will print "constructed!" on the console
foo:print() //will print "works!" on the console
但是,現在我想將一個特定的測試實例綁定到Lua。 這將使我能夠將對象傳遞給Lua,例如Player類的實例,並執行以下操作:
Player:SetPosition(200,300)
而不是采取艱難的方式,並有類似的東西
SetPosition("Player",200,300)
相應的C ++ SetPosition函數需要查找std :: map才能找到播放器。
這是否可能,如果是這樣,我怎么能在LuaBind中做到這一點?
您沒有將類的實例綁定到Lua。 類的實例只是數據,您可以通過常用方式將數據傳遞給Lua。 但是C ++對象很特殊; 因為它們是通過Luabind注冊的,所以你必須使用Luabind方法將它們提供給Lua腳本。
有幾種方法可以為Lua提供數據,Luabind涵蓋了所有這些方法。 例如,如果你有一個對象x
,它是一個向Luabind注冊的類X
的指針,你有幾種方法可以給Lua x
。
您可以將x
的值設置為全局變量。 這是通過Luabind的object
接口和globals
函數完成的:
luabind::globals(L)["NameOfVariable"] = x;
顯然,您可以將其放在另一個表中,該表位於另一個表中,可以從全局狀態訪問。 但是你需要確保表格都存在。
將此數據傳遞給Lua的另一種方法是調用Lua函數並將其作為參數傳遞。 你可以使用luabind::object
接口獲取一個函數作為對象,然后使用luabind::call_function
來調用它。 然后,您可以將x
作為參數傳遞給函數。 或者,如果您更喜歡lua_pcall
樣式語法,則可以將x
包裝在luabind::object
並使用luabind::object::push
將其推入堆棧。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.