1

这是我遇到的问题的简化版本:

[bot0.lua]

function OnHit(bot)

// Where the bot structure and vec3 
// generated using SWIG and registered to a 
// "global" lua_State that I maintain.
bot.color = vec3( 1.0, 0.0, 0.0)
end;

[bot1.lua]

function OnHit(bot)

bot.color = vec3( 0.0, 1.0, 0.0)
end;

在加载时,对于每个脚本,我首先执行以下操作(伪代码):

bot->script->L = lua_newthread( <Global lua_State where vec3 etc... are registered> )

luaL_loadbuffer( bot->script->L, botXXX.lua ...

lua_call( bot->script->L, ...

然后在我的程序运行时,当机器人被击中时,我调用:

luaL_dostring( bot->script->L, "OnHit(GetBot(\"<the bot name>\")" );

(其中GetBot也是注册在全局lua_State中的函数)。

问题是机器人总是变绿,因为 bot1.lua OnHit 在最后一个加载的机器人文件中。我认为通过使用 lua_newthread,我将能够为每个创建的“线程”定义 OnHit,这将为机器人分配正确的颜色,因为我在使用 luaL_dostring 时使用了不同的 lua_State。但实际上最新加载的 OnHit 将覆盖全局 lua_State 环境中的前一个。

我的问题是:如何为每个脚本创建不同的环境,以便为正确的 bot->script->L 调用正确的 OnHit,并且我仍然可以访问所有功能(例如我的 vec3、GetBot等...函数)在我创建的“全局”lua_State 环境中注册?

[编辑]

经过更多的研究,我认为我需要的是能够在 C 中“沙盒”。我对吗?

[编辑]

实际上并不是真正的沙盒,因为我想如果在脚本环境中查找失败,则会对全局环境进行查找。甚至可能吗?

4

1 回答 1

0

bot0.lua

local bot = {}

function bot:OnHit()
  self.color = vec3( 1.0, 0.0, 0.0)
end

return bot

bot1.lua

local bot = {}

function bot:OnHit()
  self.color = vec3( 0.0, 1.0, 0.0)
end

return bot

主程序.lua

all_bots = {[0]=require"bot0", require"bot1"}

function GetBot(name)
  if name == "bot #0" then
    return all_bots[0]
  elseif name == "bot #1" then
    return all_bots[1]
  end
end

C程序内部

luaL_dostring( bot->script->L, "GetBot('<the bot name>'):OnHit()" );
于 2013-04-16T05:46:46.187 回答