笨木头花心贡献,哈?花心?不,是用心~
转载请注明,原文地址:http://www.benmutou.com/archives/1786
文章来源:笨木头与游戏开发
[cce_lua]
game = {}
function game.play()
print("那么,开始吧");
end
function game.quit()
print("你走吧,我保证你不会出事的,呵,呵呵");
end
return game;
[/cce_lua]
我们定义了一个table,并且给这个table加了两个字段,只不过这两个字段的值是函数而已。[cce_lua]
local function main()
cc.FileUtils:getInstance():addSearchPath("src")
game = require("game");
game.play();
end
[/cce_lua]
注意,我们要require其他文件的时候,要把文件路径给设置好,否则会找不到文件。[cce_lua]
game = {}
local M = game;
function M.play()
print("那么,开始吧");
end
function M.quit()
print("你走吧,我保证你不会出事的,呵,呵呵");
end
return M;
[/cce_lua]
我们用一个局部变量M来代替了game,于是,以后我们只需要修改前面两个的game就可以了,函数部分的内容完全不需要去修改。[cce_lua]
local M = {};
local modelName = ...;
_G[modelName] = M;
function M.play()
print("那么,开始吧");
end
function M.quit()
print("你走吧,我保证你不会出事的,呵,呵呵");
end
return M;
[/cce_lua]
留意一下,这里有一个 local modelName = ...[cce_lua]
local M = {};
local modelName = ...;
_G[modelName] = M;
setfenv(1, M);
function play()
print("那么,开始吧");
end
function quit()
print("你走吧,我保证你不会出事的,呵,呵呵");
end
return M;
[/cce_lua]
我们把game.lua这个模块里的全局环境设置为M,于是,我们直接定义函数的时候,不需要再带M前缀。[cce_lua]
local M = {};
local modelName = ...;
_G[modelName] = M;
-- 方法1:使用继承
setmetatable(M, {__index = _G});
setfenv(1, M);
function play()
print("那么,开始吧");
end
function quit()
print("你走吧,我保证你不会出事的,呵,呵呵");
end
return M;
[/cce_lua]
没错,使用__index元方法就能解决这个问题了,当找不到print等函数时,就会去原来的_G里查找。[cce_lua]
local M = {};
local modelName = ...;
_G[modelName] = M;
-- 方法2:使用局部变量保存_G
local _G = _G;
setfenv(1, M);
function play()
_G.print("那么,开始吧");
end
function quit()
_G.print("你走吧,我保证你不会出事的,呵,呵呵");
end
return M;
[/cce_lua]
这种方法的缺点比较明显,那就是,每次调用print等函数时,都要使用_G前缀。[cce_lua]
local M = {};
local modelName = ...;
_G[modelName] = M;
-- 方法3:保存需要使用到的模块
local print = print;
setfenv(1, M);
function play()
print("那么,开始吧");
end
function quit()
print("你走吧,我保证你不会出事的,呵,呵呵");
end
return M;
[/cce_lua]
这种方法的缺点更明显了,所有用到的模块都要用局部变量声明一次,烦人。[cce_lua]
local M = {};
local modelName = ...;
_G[modelName] = M;
setmetatable(M, {__index = _G});
setfenv(1, M);
[/cce_lua]
就这几句代码,其实我们可以忽略不写,因为,我们有module函数,它的功能就相当于写了这些代码。[cce_lua] module(..., package.seeall);注意,前面的几行代码都没了,只留下了一个module函数的调用。
function play() print("那么,开始吧"); end
function quit() print("你走吧,我保证你不会出事的,呵,呵呵"); end [/cce_lua]