在 quick-cocos2d-x 中导出 CCFileUtils::getFileData 给Lua使用
来源:互联网 发布:c语言中文网12 编辑:程序博客网 时间:2024/06/07 01:10
- 本站文章除注明转载外,均为本站原创或者翻译。
- 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商;
- 本站部分原创和翻译文章提供markdown格式源码,欢迎使用文章源码进行转载;
- 本文标题:在 quick-cocos2d-x 中导出 CCFileUtils::getFileData 给Lua使用
- 本文链接:http://zengrong.net/post/1958.htm
在 quick-cocos2d-x 中导出 CCFileUtils::getFileData 给Lua使用
2013-11-18更新:廖大在 468be4 这次提交中解决了本文提到的问题并进行了 getFileData 和 getFileDataFromZip 两个方法的导出。如果你使用的是develop分支,只需要pull即可,下面的修改不必做了。当然,可以继续将本文当作导出教程。
本文讲解如何将 cocos2d-x 中的 CCFileUtils::getFileData 方法导出给Lua使用。提纲如下:
- quick-cocos2d-x 读取外部文件的问题
- 简单地使用 tolua++ 导出
- 获取到的字符串问题
- 修改 cocos2d-x 源文件解决字符串问题
- 重新编译和测试
本文基于 quick-cocos2d-x devel 分支 e55be13b8d6275c3eee3e86651f42857d5f1576f
版本(2013-10-22)
一、 quick-cocos2d-x 读取外部文件的问题
在将 cocos2d-x 制作的一个 Demo 移植到 quick-cocos2d-x 时,我碰到了读取外部文件的问题。
这个 Demo 使用一个 JSON 文件作为数据文件,在 cocos2d-x 中,我使用 CCFileUtils::getFileData 来读取这个 JSON 文件。
查看了一下 [quick-cocos2d-x]/lib/luabinding/cocos2dx/platform/CCFileUtils.tolua 发现其中并没有导出 getFileData 方法。
可以使用 Lua 的 io 库来读取,例如这样:
io.input("res/fightdata.json")local __jsonTxt = io.read("*all")print(__jsonTxt) local __json = json.decode(__jsonTxt)print(__json.actions)
但这样一来,就无法跨平台了,例如在 Android 真机上,是读取不到 fightdata.json 的。
其中原因 廖大做了说明 :
假定有一个 res/game.json 文件
build_native.sh 执行时会将 res 目录中的所有内容复制到 proj.android/assets/res 目录中
编译结束,用 Eclipse 打包 apk 时,打包工具会将整个游戏打包为一个 apk 文件
将 apk 安装到设备上后,apk 文件的内容并不会解压缩(apk 实际是 ZIP 压缩文件格式)由于 apk 文件在设备上并不会解压缩,所以其中包含的文件就无法直接通过文件系统读取(因为文件都内嵌在 apk 里,而没有实际保存在文件系统中)。
但是 Android 也提供了一种间接的途径来访问文件:
假定原始目录是 res/game.json
那么在 Android 上应该以 assets/res/game.json 的路径读取
既然 quick 没有导出,那么我就来导出试试。不过为什么 quick 没有导出这个方法呢?
二、 简单地使用 tolua++ 导出
修改 [quick-cocos2d-x]/lib/luabinding/cocos2dx/platform/CCFileUtils.tolua 文件,在其中加入下面这行:
unsigned char* getFileData(const char* pszFileName, const char* pszMode, unsigned long * pSize);
然后运行 [quick-cocos2d-x]/lib/luabinding/build.bat ,它会生成 [quick-cocos2d-x]/lib/cocos2d-x/scripting/lua/cocos2dx_support/LuaCocos2d.cpp 这个 60,000+ 行的文件,所有的 Lua 绑定均在其中。
重新编译 quick-cocos2d-x 中的 player 项目。
三、 获取到的字符串问题
在 player 中运行下面的 Lua 代码:
local __size = 0local __jsonTxt = fileUtil:getFileData("fightdata.json", "r", __size)print(__jsonTxt)
发现输出的 JSON 文本最后会多出一些字节,这样的 JSON 当然不能解析成功:
换了一个 XML 文件载入,也一样会多出字节。
我猜想这应该是 C++ 与 Lua 通信时对字符串末尾结束字节计算不正确所致。
四、 修改 cocos2d-x 源文件解决字符串问题
为了解决这个问题,需要修改 cocos2d-x 源码。涉及的文件有下面两个:
- [quick-cocos2d-x]/lib/cocos2d-x/cocos2dx/platform/CCFileUtils.h
- [quick-cocos2d-x]/lib/cocos2d-x/cocos2dx/platform/CCFileUtils.cpp
在头文件中找到 getFileData 的声明,在其上方增加一个重载函数的声明:
// ......... many codes/** * Get resource file data(for lua export) * zrong 2013-10-31 */unsigned char* getFileData(const char* pszFileName);virtual unsigned char* getFileData(const char* pszFileName, const char* pszMode, unsigned long * pSize);// ......... many codes
在cpp文件中找到 getFileData 的定义,在其上方定义这个重载函数:
// ......... many codes// for lua export// zrong 2013-10-31unsigned char* CCFileUtils::getFileData(const char* pszFileName){ unsigned long __size = 0; unsigned char* __pFileContent = getFileData(pszFileName, "r", &__size); if (0 == __size) { CCLuaLog("CCFileUtils::getFileData: file length is 0, return null"); return NULL; } if (__pFileContent[__size] != '\0') __pFileContent[__size] = '\0'; //let the texts have correct size return __pFileContent;}unsigned char* CCFileUtils::getFileData(const char* pszFileName, const char* pszMode, unsigned long * pSize){}// ......... many codes
我猜想 quick 没有导出 getFileData 方法,应该是因为不愿意修改源文件。因为这样一来,就对 cocos2d-x 底层进行了修改,影响了 quick 的设计初衷。
五、 重新编译和测试
再次修改 CCFileUtils.tolua 文件,改变 getFileData 的签名:
unsigned char* getFileData(const char* pszFileName);
运行 tolua++ ,重新编译 player。
在 player 中运行下面的 Lua 代码:
local __size = 0local __jsonTxt = fileUtil:getFileData("fightdata.json", "r", __size)print(__jsonTxt)
搞定。
- 在 quick-cocos2d-x 中导出 CCFileUtils::getFileData 给Lua使用
- CCFileUtils::getFileData 使用[coco2d-x]
- quick-cocos2d-x 导出 C/C++ API 给 Lua 使用
- 在quick-cocos2d-x中添加自定义的类给lua使用
- 在quick-cocos2d-x中添加自定义的类给lua使用
- 在Quick-Cocos2d-x中添加自定义的类给Lua使用
- Quick-Cocos2d-x 使用tolua工具导出C++的类给Lua调用
- Quick-Cocos2d-x 使用tolua工具导出C++的类给Lua调用
- Quick-Cocos2d-x 使用tolua工具导出C++的类给Lua调用
- Quick-Cocos2d-x 使用tolua工具导出C++的类给Lua调用
- Quick-Cocos2d-x 使用tolua工具导出C++的类给Lua调用
- Quick-Cocos2d-x 2.26 使用tolua工具导出C++的类给Lua调用WINDOWS篇
- cocos2d-x quick 导出c++到Lua
- 在Quick-cocos2d-x中使用LuaXML
- 使用BabeLua在Quick-cocos2d-x中编辑和调试Lua
- 使用BabeLua在Quick-cocos2d-x中编辑和调试Lua
- Quick-Cocos2d-x 2.26 用tolua导出C++类给lua调用WINDOWS篇例子2
- 在Quick Cocos2d-x中给CocosStudio中导出的UI(Widget)控件增加触摸(touch)事件
- 新生管理系统,加入了数据库后永久保存(只是学生的增删改查方法)
- jquery ajax属性
- LINUX——在命令行模式下执行命令
- css里面图片路径问题(同包/不同包)探讨
- 国内UED大全
- 在 quick-cocos2d-x 中导出 CCFileUtils::getFileData 给Lua使用
- Flex工具下载链接
- 一、oracle 高水位线详解
- HTML5Ssec.org中文版
- 为什么对带www和不带www的域名ping结果不一致
- 委托与事件
- C# webservice初探
- 关于UITableView的一个崩溃现象分析
- mysqlhotcopy 热备工具体验与总结