项目开发日志系列(三)
配置环境与工具: cocos2d-x-2.2.3
,Lua5.1
,tulua++
,Xcode
;
测试工程: /cocos2d-x-2.2.3/samples/Lua/HelloLua
Lua在我的项目中的定位
Lua本来是一种轻快而小巧的脚本语言,随着手游大行其道,它逐渐被用来开发中型 甚至大型的项目,在我的项目中 并不打算全部逻辑放到Lua层,而是让轻快的Lua去做轻快的事情,Lua只是火车上的舒服的空调或者座椅.让火车头C++同学去做火车头应该做的事情.
Lua中的require
require函数实现了不同lua文件的加载,类似于C++中的include
,java中的import
,
require函数会在路径中搜索输入的文件路径,大致流程如下:
- 在package.loaded查找 若找到 则结束
- 在package.preload查找 如果preload存在 则调用 结束
- 根据package.path的模式查找lua库 若找到 结束
- 根据package.cpath查找c库 若找到 则加载C库 然后进行加载C库的处理,处理完成后 则结束
这个过程虽然并不复杂,但是在搜索过程中 可能会涉及几个模块式路径:
./?.lua;./?.lc;/usr/local/?/init.lua
使用require,我认为可能的隐患
但是目前我项目中是几个同事一起协作 各自编写不同模块的Lua代码.这就有一个隐患(可能是隐患),如果两个同事在不同路径编写的lua文件同名 例如都叫init.lua
.那在require调用搜索的时候会不会发生引用错误呢?我对这个问题目前还不太确定,由此对加载lua文件有了另外一种实现方式.
增加C接口实现调用
参照上一篇给Lua增加C接口函数.我们再增加一个函数 实现给Lua加载lua文件.
//GameLuaAPI.H // tolua_begin void API_LoadLuaFile( char *szLUAFileName); void API_LuaSample(); // tolua_end
函数的实现:
// GameLuaAPI.cpp // 加载LUA脚本 void API_LoadLuaFile( char *szLUAFileName) { CCLOG("API_LoadLuaFile = %s",szLUAFileName); CCLuaEngine* pEngine = CCLuaEngine::defaultEngine(); std::string path = CCFileUtils::sharedFileUtils()->fullPathForFilename(szLUAFileName); pEngine->executeScriptFile(path.c_str()); }
然后导出到Lua,在Lua中如此加载源文件:
-- add lua source file API_LoadLuaFile("test.lua") -- add end function main( ) -- sample call c++ func API_LuaSample() -- sample cal lua func test(); end main()
如此遍实现了 脱离require函数来实现加载源文件的功能.
这种方式靠谱不靠谱呢?
目前我的项目中选择使用这种方式
所有Sample托管在我的github