2012-05-04 35 views
0

我正在使用LuaBind在我的遊戲中實現Lua腳本,而我不清楚的其中一件事是重新加載活動遊戲中的腳本。如何鏈接到Lua中的回調函數,以便在重新加載腳本時更新回調函數?

目前,使用LuaBind C++類luabind::object,我直接在使用它們的類中保存對Lua回調的引用。然後,我可以使用luabind::call_function使用該對象來調用C++代碼中的Lua代碼。

我還沒有測試過,但我的假設是,如果我重新加載腳本,那麼所有的功能將被重新定義,但對舊功能的引用仍將以luabind::object的形式存在C++代碼。我希望能夠替換掉新的舊版本,而無需爲遊戲中的每個腳本鉤子手動進行管理。

如何最好地改變這個過程,以便過程起作用?

我的第一個想法是不直接保存對函數的引用,而是可以保存函數名稱,並在每次調用它時都按名稱獲取函數。我正在尋找更好的想法!

+0

-1:[堆棧溢出不是交叉發佈友好](http://meta.stackexchange.com/a/129890/164572) –

回答

2

我的第一個想法是不直接保存對函數的引用,而是可以保存函數名稱,並在每次調用它時按名稱獲取函數。

如果您的類正在調用具有已知名稱的全局函數,那麼這幾乎可以解決您的問題。無需事先獲取參考;它不會帶來可衡量的性能差異。我認爲call_function支持將函數名作爲字符串傳遞,對嗎?


當Lua腳本註冊回調時,您通常會存儲對函數值的引用。在這種情況下,它比存儲名稱好得多,因爲它允許Lua腳本註冊本地,匿名等功能。


如果你真的搶提前值的值,因爲你現在做的(而且也實在沒有理由這樣做,但我們會假裝這是必要的),我想補充一個間接層。你可以有一個封裝全局名稱的LuaFunctionReference類。在實例化過程中,它抓取了全局包含的函數的引用。這些對象可以從維護所有這些參考列表的工廠獲得。當您重新加載腳本時,您可以擁有工廠/經理/池/等。對象遍歷引用並讓它們自己更新,因此整個系統中所有放在類中的引用都會被更新。

+0

當然。從本質上講,你在課堂上所做的是在課堂建設時抓住一個給定名字引用的函數值的引用。但是,如果腳本作者在其腳本執行期間重新定義了該函數呢?在這種情況下,你的班級將不會接受更改,它會引用舊功能。僅僅因爲這個原因,通過價值來保存對函數的引用並不是一個好主意。 – Mud

+0

哈哈,我們編輯太多了!感謝您的評論:D – Raptormeat

+1

是的。這意味着腳本作者可以將你想要調用的函數傳遞給你,這可以消除兩個問題(OP和上面提到的問題)。如果你正在進行調用,那麼你依賴於用戶將一個函數值存儲在一個特定的全局名稱中。這意味着你應該在通話的時候檢索,而不是提前。你現在正在做的事情除了作爲一種優化(防止一次全局查找)之外確實沒有任何價值,但是這樣做還爲時過早,因爲它不會產生可衡量的影響,並且會增加現在正在處理的問題。 – Mud