守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 526|回复: 0

[技术资料] Lua的Require的另一种实现

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51724
    钢镚
    1422

    开源英雄守望者

    发表于 2015-1-16 13:38:29 | 显示全部楼层 |阅读模式
    配置环境与工具: 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文件.

    1. //GameLuaAPI.H
    2. // tolua_begin
    3. void API_LoadLuaFile(  char *szLUAFileName);
    4. void API_LuaSample();
    5. // tolua_end
    复制代码
    函数的实现:


    1. // GameLuaAPI.cpp
    2. // 加载LUA脚本
    3. void API_LoadLuaFile( char *szLUAFileName)
    4. {
    5.     CCLOG("API_LoadLuaFile = %s",szLUAFileName);
    6.     CCLuaEngine* pEngine = CCLuaEngine::defaultEngine();
    7.     std::string path =
    8.     CCFileUtils::sharedFileUtils()->fullPathForFilename(szLUAFileName);
    9.     pEngine->executeScriptFile(path.c_str());
    10. }
    复制代码
    然后导出到Lua,在Lua中如此加载源文件:
    1. -- add lua source file
    2. API_LoadLuaFile("test.lua")
    3. -- add end

    4. function main(  )
    5.     -- sample call c++ func
    6.     API_LuaSample()
    7.     -- sample cal lua func
    8.     test();
    9. end

    10. main()
    复制代码
    如此遍实现了 脱离require函数来实现加载源文件的功能.这种方式靠谱不靠谱呢?目前我的项目中选择使用这种方式所有Sample托管在我的github

    本文来自:http://shadowkong.com/archives/1741

    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-9-24 17:32 , Processed in 0.040967 second(s), 33 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表