2013-10-21 93 views
2

我看了很多來源,我只是不明白他們。大多數情況下,他們都使用像luaBind這樣的庫(我不想使用它,因爲它依賴於Boost),或者它們不是C++中的實例化對象,而是直接在Lua中創建的。在Lua 5.2中返回一個C++對象的實例?

我有一個Player類,它被包裝在另一個類來處理Lua調用。我在應用程序的初始化過程中創建了這兩個對象的std :: vector列表。

所以基本上我不想讓Lua腳本創建這些播放器對象,我只想創建一個函數getPlayer()然後返回Lua包裝的對象。我不知道從哪裏開始爲Lua定義Lua包裝對象來調用,也不知道如何將對象的實例返回給Lua,以便我可以使用它的調用。

這裏是什麼,我想我的Lua中看起來像一個例子:

player = getPlayer(1) -- Returns the Lua wrapped object from C++ where 1 is the object's index in the std::vector list 
print("Player's name: ", player:name()) -- Print's the player's name 

可能有人點我一個體面的教程,說明如何做到這一點。我非常肯定,這不是某種「從未做過,爲什麼你會想要」的情況下,肯定至少必須有一個教程。我一直在尋找大約2天,沒有積極的結果。

+0

LuaBridge對Boost沒有依賴性。它的手冊解釋了很多關於Lua和C++之間共享對象的生命週期的缺陷 –

回答

1

這不是一個Never been done任務,但他們使用Lua的公司已經對Lua的原始來源做了很多改變和改進,以使其適合他們想要的地方。由於我們所有的程序員都不太喜歡在第三方資源上做這樣的事情,所以我們必須使用任何存在的東西。您認爲Crytek使用的是與其網站存儲庫中的Lua完全相同的版本?不,先生。

您可以通過使用userdata來實現此目的。或者你可以使用meta tables。另外還有一段代碼Luna,它可以幫助你更快地完成任務。

否則,這一切都是Luabind,並相信我你會最終以這樣或那樣的方式使用它。此外,它對Boost的使用並不那麼廣泛,最終的可執行文件將會增加200kb。如果你想在某些時候使用Luabind,請檢查這個地址,這真的是一個很好的網絡文章。 http://blog.nuclex-games.com/tutorials/cxx/luabind-introduction/

如果你對Lua感到厭倦,我建議你使用squirrel作爲Lua的替代方案。就我個人而言,我比松鼠更喜歡松鼠,因爲它的C語法和它的能力是我們想要的。此外,你甚至可以在它的上下文中聲明常量並使用實際的類,而Lua在這方面相當失敗。關於松鼠的有趣之處在於設計師是他一直致力於FarCry開發Lua引擎的人。

+0

非常感謝,我剛剛查看了[LuaBridge](http://vinniefalco.com/LuaBridge/Manual.html)和I以最小的努力達到目前的效果。我可能不得不在某種程度上訴諸於Luabind。 再一次感謝他們看起來會幫助我的資源。 – Zinglish

+1

@Zinglish LuaBridge也不錯。看看這個頁面:http://realmensch.org/blog/fun-lua-bindings。這對於爲Lua選擇一個良好綁定的庫非常有用。 – MahanGM