我从"编程在Lua"由罗伯托·萨利姆斯学习,我发现,在本书中,沙箱的示例使用功能setfenv()改变给定函数的环境,但在Lua 5.2这一功能不再可用.
我试图将一些文件(配置文件)中的值加载到表中的字段中,但是在lua 5.2中我不能使用setfenv(所以我可以在给定的环境中加载值).在阅读了一些关于lua 5.2的文章之后,我发现每个函数可能有(或没有)一个名为_ENV的upvalue作为环境,因此,我尝试了以下代码:
function sandbox(sb_func, sb_env)
if not sb_func then return nil, "sandbox function not valid" end
sb_orig_env = _ENV
_ENV = sb_env -- yes, replaces the global _ENV
pcall_res, message = pcall( sb_func )
local modified_env = _ENV -- gets the environment that was used in the pcall( sb_func )
_ENV = sb_orig_env
return true, modified_env
end
function readFile(filename)
code = loadfile(filename)
res, table = sandbox(code, {})
if res then
--[[ Use table (modified_env) ]]-- …Run Code Online (Sandbox Code Playgroud) 我正在用Java编写一个游戏,这是我第一个尝试"漂亮"的游戏.这款游戏被称为Bantumi - 它是一款棋盘游戏,现在我正在为动作编写动画.问题在于,当运动动画运行时,棋盘仍然会获得鼠标事件,如果用户选择了新的动作,则将丢弃正在运行的动作.
对于董事会,我正在使用扩展JLayeredPane的类.这是我如何拥有我的图层:
第0层:带有种子的洞,因此用户选择一个用于移动,每个孔是带有MouseListener的JPanel.
第1层:标记当前所选孔的突出显示
第2层:运动的动画.
第10层:我写的一个自定义通知系统类,它说的是"你的转弯","重复转弯","你赢了"等等.
我想在动画运行时阻止任何这些图层中的每个可能的鼠标事件,我该怎么做?我认为在顶级播放器中添加一个覆盖整个区域的面板就足够了,但它没有用.任何解决方法?