在我的引擎中,目前每个实体都有自己的lua_State *
链接到它。基本实体类有一个函数linkScript(const char *scriptPath)
,它将调用luaL_dofile(luaState, scriptPath)
。所有这一切都很好,但游戏仍然很小。我一直在读书,我注意到我正在做的事情被认为是不好的做法。建议我有一个全局lua_State *
并将所有函数加载到全局内存中。起初,我认为自己“好吧,很简单”,但我很快遇到了一个问题:每个Lua文件都定义了自己的init()
,tick()
并应用了一些EventHooks。如果没有每个脚本覆盖以前脚本对这些函数的定义,如何共享全局lua_State *
?每个帧和/或每次触发事件时都会调用这些函数。我需要能够区分每个脚本的实现。
答案 0 :(得分:3)
您基本上希望将每个脚本视为具有自己功能的对象。当您加载脚本并运行它时,您不希望它的函数进入全局名称空间,而是进入特定于它的表中,并且具有一个存储所有这些表的全局表。
有很多方法可以做到这一点,但我想到的是:你创建一个全局表allObjects,然后为每个脚本创建:
-- object1Script.lua
allObjects.object1 = {
init = function()
...
end,
tick = function()
...
end
}
您为每个脚本执行上述操作,但每个脚本在allObjects
表中创建一个不同的条目,第一个脚本创建object1
,第二个脚本创建object2
等等。如果您不这样做我想命名你可以使用数组的脚本,即allObjects.insert( { ... table of init, tick etc functions ...} )
。大概你会遍历allObjects表来适当地调用每个“对象”的init()或tick()等。
我认为以上是基本方法,希望它能激发你找到自己的方法。