2012-10-01 51 views
-1

我在我的C++遊戲引擎中實現了Lua腳本引擎,我在想什麼是存儲和執行Lua腳本的最佳方式。我有很多場景節點,每個節點都可以擁有自己的腳本。正在調用lauL_dofile(...)每個幀爲特定的腳本一個可行的選擇,還是有更好的方法?例如,有沒有辦法存儲已經解析過的腳本?我正看着luaL_loadfilelua_pcall。我想我會加載第一個腳本,並在需要時用第二個腳本調用它們,但是lua_pcall似乎沒有唯一的id作爲參數,那麼我應該如何知道要執行哪個腳本?存儲腳本

+0

通常,您想在初始化時調用'luaL_loadfile',並在運行時調用'lua_pcall'。 –

+0

但我怎麼知道哪個腳本要調用? lua_pcall中的哪個參數指示應執行哪個腳本? – SMart

+1

-1:我自己辯論是否要回答這個問題,因爲答案可以總結爲「閱讀參考資料」。起初,我決定不去,因爲文檔可能有點混亂。然後我看到[lua_call]的文檔(http://www.lua.org/manual/5.1/manual.html#lua_call)有一個完全成功的例子,說明如何像Lua一樣執行一個電話。因此,在這種情況下,文檔的鈍感不是一個藉口。 –

回答

1

如果您打算使用Lua API,您需要熟悉Lua堆棧。你可以學會做的最重要的事情之一是瞭解如何閱讀the Lua API docs.對於每個函數,右邊都有一個關於它如何影響堆棧的符號(如果它完全修改堆棧的話)。

luaL_loadfile加載文件並將該文件作爲Lua函數壓入堆棧。 lua_pcall在堆棧上執行一個函數。但它有一些關於它如何做的警告。

通過Lua調用函數的方式在棧中工作很簡單。您推送您想要調用的功能。然後你按順序從頭到尾推動所有的論點。然後你發出你的那個函數的調用。 lua_pcall以這種方式工作。這意味着要執行的函數的位置是總是nargs + 1,相對於棧頂,其中nargs是傳遞給函數的參數數量。

請注意,lua_pcall彈出功能從堆棧(以及所有的參數)。如果你只是加載了這個文件,這將只是這個函數在Lua中的引用。因此,您將無法再次執行該文件。在使用lua_pushvalue to copy it將參數推入堆棧之前,您應該複製該函數。你應該堅持它在LUA_REGISTRYINDEX表或其他東西,所以它的價值被保留。

+0

我沒有看到閱讀文檔會如何幫助(閱讀過一次),也許經過幾次之後,但至少您的回答包含了我需要進一步研究的所有信息。謝謝。 – SMart

0

正如我所說,你通常在初始化時調用luaL_loadfile。加載的文件通常將一些[全局]名稱(或填充某些全局表中的某些插槽)定義爲Lua函數。 lua 5.2 documentation給出了一個示例(§4lua_call)如何調用其中之一。您可以在應用程序的適當位置執行此類調用(可能使用lua_pcalllua_call),方法是在Lua堆棧上推送適當的東西。