2013-12-12 59 views
2

在我的引擎中,目前每個實體都有自己的鏈接到它的lua_State *。基本實體類具有功能linkScript(const char *scriptPath),它將調用luaL_dofile(luaState, scriptPath)。所有這些工作都非常好,但是遊戲仍然很小。我一直在閱讀,我注意到我正在做的事情被認爲是不好的做法。建議我擁有全局的lua_State *並將所有功能加載到全局內存中。起初,我想我自己「好吧,很簡單」,但我很快遇到了一個問題:每個Lua文件都定義了自己的init()tick()並應用了一些EventHooks。如何在沒有每個腳本的情況下覆蓋前面的腳本定義這些功能的全局lua_State *?這些功能在每一幀和/或每次觸發事件時被調用。我需要能夠區分每個腳本的實現。如何在遊戲引擎中使用全局lua_State *?

回答

3

你基本上想把每個腳本作爲一個具有自己功能的對象。當您加載腳本並運行腳本時,您不希望其功能進入全局命名空間,而是在特定於其的表中,並且具有存儲所有這些表的全局表。

有這樣做的方法很多,但一個想到的是這樣的:你創建一個全局表allObjects,然後爲你做的每個腳本:您要爲每個腳本做上述

-- object1Script.lua 
allObjects.object1 = { 
    init = function() 
     ... 
     end, 
    tick = function() 
     ... 
     end 
} 

,但每一個都在allObjects表中創建了不同的條目,第一個腳本的object1,第二個腳本的object2等。如果您不想命名腳本,則可以使用數組,例如allObjects.insert({ ... table of init, tick etc functions ...})。大概你會遍歷所有的對象表來調用每個「對象」的init()或者tick()等。

我認爲上述是基本的方法,希望它激發你找到自己的。

+0

完美,這正是我所需要的。一個非常簡單的解決方案,我很驚訝,我甚至沒有想到這一點。 – Brett