2012-11-11 38 views
2

大多數綁定庫/包讓我們非常清楚如何公開一個類TYPE,以便它可以在Lua腳本上創建。如何推送現有/創建/實例化的類對象用於Lua腳本?

什麼是真正困難的是,如何給一個Lua腳本一個已經創建/實例化/分配的類對象,以便你可以從Lua腳本中調用它的暴露/綁定方法(更新對象也在在C++方面)..

如果這仍然不清楚,我會舉出我現在所擁有的真實例子。

即時通訊使用Lunar將我的AIAgent類方法公開給Lua。 它的工作,我可以創建在Lua腳本上的AIAgents ..但誰在乎,我不在Lua編程,我使用Lua編寫我的AI代理,我的遊戲引擎的一部分,由我的遊戲引擎創建,更新/碰撞檢測和響應/繪圖都是由C++代碼完成的,腳本應該做的唯一事情就是爲代理提供決策代碼(一種調用代理更新方法的lua協程)。這一決定化妝腳本訪問某些註冊(谷農曆)方法(GetHP,GetNAmmunition,GetPlayerPos,等..)

所以,我怎麼可以給我的腳本..對象類似的東西:

//-fake code- called on the AIAgent constructor, or something 
lua_pushObject(luaState, this); 
lua_setGlobal("aiAgentFromC++", -1); // object exposed trough "aiAgentFromC++" global var 

請注意,方法已經公開,因爲我可以在腳本上創建新的對象,我只是不知道如何給腳本一個對象,我已經在c + +端。

+1

您是否考慮切換到具有*網站*的Lua綁定系統?還是手冊?或者一些實際的文檔,除了一些很少解釋的示例代碼之外?我找不到「Lunar」的任何內容。 SWIG,Lua ++,LuaBind等等,這些都是真實的文檔。農曆不是。 –

+0

LuaBind很慢,我在StackOverflow上尊敬這裏說的一個傢伙; SWIG看起來令人難以置信的複雜,我尋找輕量級軟件包,如果你可以推薦我一個,我真的很高興..我雖然月球是好的,因爲我得到它的工作快,直到我碰到一堵牆.. – Icebone1000

回答

2

LuaBridge在我看來是最簡單的方法。它也是輕量級且無依賴性的。你說:

林具有真正的困難是什麼,是如何給一個Lua中 已創建/實例化/分配類對象

它恰好能夠

一樣品: C++

class A { 
public: 
    void print(int x) { 
     std::cout<<x<<std::endl; 
    } 
}; 

RefCountedPtr<A> GiveMeA() 
{ 
    static RefCountedPtr<A> a(new A); 
    return a; 
} 

int main() 
{ 
    lua_State *L = lua_open(); 
    luaL_openlibs(L); 
    int s = luaL_loadfile(L, "test.lua"); 

    luabridge::getGlobalNamespace(L) 
     .beginClass<A>("A") 
     .addConstructor<void (*)()>() 
     .addFunction("print",&A::print) 
     .endClass() 
     .addFunction("GiveMeA",&GiveMeA); 

    if (s==0) { 
     s = lua_pcall(L, 0, LUA_MULTRET, 0); 
    } 
    report_errors(L, s); 
    lua_close(L); 
} 
在Lua

local a=A() 
a:print(42) 
local b=GiveMeA() --created on the C++ side 
b:print(42) 
+1

wheres究竟在代碼中你正在實例化一個對象並給予lua?本地a = A()是一個新的對象..正如我在第一段中所說的那樣,它恰好不是我想要的...... – Icebone1000

+0

你如何識別你的對象?你可以綁定一個接口並提供一個工廠函數,它會給你在C++端創建的實例。但是你必須知道你想要哪個物體。待定示例... –

+1

我在第一篇文章中給出了我的全部情況,引擎創建了這個aiagent,然後我給出了一個關於如何通過lua_setGlobal(「aiAgentFromC++」,-1)暴露它的例子(-fake code-) ;給這個指針,我怎麼能比這個更清楚? – Icebone1000

相關問題