cocos自定义类 绑定到lua
2015-08-17 15:51
411 查看
1:按照\frameworks\cocos2d-x\tools\tolua下的README.mdown的指示一步一步做下去。务必要和文件中描述的一样,我已经被这个坑爹的东西坑的很惨了。(检查这个有没有配置好的方法是:运行下那个genbindings.py,看是否能生成liblua的auto目录下的那些文件。如果能,那么你的环境配置就成功了。)
2:写一个自定义的C++类
例子:
<span style="font-family:KaiTi_GB2312;font-size:14px;">#pragma once
#include "cocos2d.h"
USING_NS_CC;
class MyClass : public Ref
{
public:
MyClass(void);
~MyClass(void);
bool init() { return true; };
CREATE_FUNC(MyClass);
int foo(int i);
};
</span>
3:在\frameworks\cocos2d-x\tools\tolua目录下 可以看到很多.ini文件和一个genbindings.python文件。
随便拷贝一个.ini文件,我重命名:myclass.ini。复制一份python文件,重命名为:mygenbindings.python。
修改两个配置文件:
python文件需要做的修改:
<span style="font-family:KaiTi_GB2312;font-size:14px;"> cmd_args = {'cocos2dx.ini' : ('cocos2d-x', 'lua_cocos2dx_auto'), \
'cocos2dx_extension.ini' : ('cocos2dx_extension', 'lua_cocos2dx_extension_auto'), \
'cocos2dx_ui.ini' : ('cocos2dx_ui', 'lua_cocos2dx_ui_auto'), \
'cocos2dx_studio.ini' : ('cocos2dx_studio', 'lua_cocos2dx_studio_auto'), \
'cocos2dx_spine.ini' : ('cocos2dx_spine', 'lua_cocos2dx_spine_auto'), \
'cocos2dx_physics.ini' : ('cocos2dx_physics', 'lua_cocos2dx_physics_auto'), \
'cocos2dx_experimental_video.ini' : ('cocos2dx_experimental_video', 'lua_cocos2dx_experimental_video_auto'), \
'cocos2dx_experimental.ini' : ('cocos2dx_experimental', 'lua_cocos2dx_experimental_auto'), \
'cocos2dx_controller.ini' : ('cocos2dx_controller', 'lua_cocos2dx_controller_auto'), \
}</span>
变成:
<span style="font-family:KaiTi_GB2312;font-size:14px;">cmd_args = {
'myclass.ini' : ('myclass', 'lua_myclass_auto'), \
}</span>
修改myclass.ini文件:
[myclass](很重要,要和文件名一样。我被这个坑了很久),这个是第一行
prefix = myclass
target_namespace = (我的没有命名空间)
headers = %(cocosdir)s/../runtime-src/Classes/MyClass.h(这是我的类路径,和AppDelegate在一起,根据你自己的路径配置吧)
classes = MyClass
后面的skip = ,rename_functions = 等等都变成空的。
这样就可以生成lua和cocos中间文件了。就像lua_cocos2dx_auto.cpp和hpp那样。由于我们在python文件中没有改变中间文件的生成路径,所以应该和lua_cocosdx_auto在同一个目录下。
将我们自定义的类进行注册,在AppDelegate.cpp文件中加入一下代码:
<span style="font-family:KaiTi_GB2312;font-size:14px;">auto engine = LuaEngine::getInstance();
register_all_myclass(engine->getLuaStack()->getLuaState());//在这里加入这行代码</span>这样就对我们的自定义类进行了注册。
对项目进行编译,发现会报错:
<pre name="code" class="html"><span style="font-family:KaiTi_GB2312;font-size:14px;">"int __cdecl register_all_myclass(struct lua_State *)" (?register_all_myclass@@YAHPAUlua_State@@@Z),该符号在函数 "public: virtual bool __thiscall AppDelegate::applicationDidFinishLaunching(void)" (?applicationDidFinishLaunching@AppDelegate@@UAE_NXZ) 中被引用</span>
解决办法:将刚才生成的两个文件加入到liblua项目中去,重新生成liblua项目。搞定啦!!
4:在lua代码中调用我们的类吧。
在hello2.lua 的main()中加入:
<span style="font-family:KaiTi_GB2312;font-size:14px;">local test = MyClass:create()
print("the first cocos bind lua result "..test:foo(2))</span>
发现输出了我们要的答案。这样就完成了cocos自定义类绑定到lua中了。
2:写一个自定义的C++类
例子:
<span style="font-family:KaiTi_GB2312;font-size:14px;">#pragma once
#include "cocos2d.h"
USING_NS_CC;
class MyClass : public Ref
{
public:
MyClass(void);
~MyClass(void);
bool init() { return true; };
CREATE_FUNC(MyClass);
int foo(int i);
};
</span>
<span style="font-family:KaiTi_GB2312;font-size:14px;">#include "MyClass.h" MyClass::MyClass(void) { } MyClass::~MyClass(void) { } int MyClass::foo(int i) { return i + 100; } </span>
3:在\frameworks\cocos2d-x\tools\tolua目录下 可以看到很多.ini文件和一个genbindings.python文件。
随便拷贝一个.ini文件,我重命名:myclass.ini。复制一份python文件,重命名为:mygenbindings.python。
修改两个配置文件:
python文件需要做的修改:
<span style="font-family:KaiTi_GB2312;font-size:14px;"> cmd_args = {'cocos2dx.ini' : ('cocos2d-x', 'lua_cocos2dx_auto'), \
'cocos2dx_extension.ini' : ('cocos2dx_extension', 'lua_cocos2dx_extension_auto'), \
'cocos2dx_ui.ini' : ('cocos2dx_ui', 'lua_cocos2dx_ui_auto'), \
'cocos2dx_studio.ini' : ('cocos2dx_studio', 'lua_cocos2dx_studio_auto'), \
'cocos2dx_spine.ini' : ('cocos2dx_spine', 'lua_cocos2dx_spine_auto'), \
'cocos2dx_physics.ini' : ('cocos2dx_physics', 'lua_cocos2dx_physics_auto'), \
'cocos2dx_experimental_video.ini' : ('cocos2dx_experimental_video', 'lua_cocos2dx_experimental_video_auto'), \
'cocos2dx_experimental.ini' : ('cocos2dx_experimental', 'lua_cocos2dx_experimental_auto'), \
'cocos2dx_controller.ini' : ('cocos2dx_controller', 'lua_cocos2dx_controller_auto'), \
}</span>
变成:
<span style="font-family:KaiTi_GB2312;font-size:14px;">cmd_args = {
'myclass.ini' : ('myclass', 'lua_myclass_auto'), \
}</span>
修改myclass.ini文件:
[myclass](很重要,要和文件名一样。我被这个坑了很久),这个是第一行
prefix = myclass
target_namespace = (我的没有命名空间)
headers = %(cocosdir)s/../runtime-src/Classes/MyClass.h(这是我的类路径,和AppDelegate在一起,根据你自己的路径配置吧)
classes = MyClass
后面的skip = ,rename_functions = 等等都变成空的。
这样就可以生成lua和cocos中间文件了。就像lua_cocos2dx_auto.cpp和hpp那样。由于我们在python文件中没有改变中间文件的生成路径,所以应该和lua_cocosdx_auto在同一个目录下。
将我们自定义的类进行注册,在AppDelegate.cpp文件中加入一下代码:
<span style="font-family:KaiTi_GB2312;font-size:14px;">auto engine = LuaEngine::getInstance();
register_all_myclass(engine->getLuaStack()->getLuaState());//在这里加入这行代码</span>这样就对我们的自定义类进行了注册。
对项目进行编译,发现会报错:
<pre name="code" class="html"><span style="font-family:KaiTi_GB2312;font-size:14px;">"int __cdecl register_all_myclass(struct lua_State *)" (?register_all_myclass@@YAHPAUlua_State@@@Z),该符号在函数 "public: virtual bool __thiscall AppDelegate::applicationDidFinishLaunching(void)" (?applicationDidFinishLaunching@AppDelegate@@UAE_NXZ) 中被引用</span>
解决办法:将刚才生成的两个文件加入到liblua项目中去,重新生成liblua项目。搞定啦!!
4:在lua代码中调用我们的类吧。
在hello2.lua 的main()中加入:
<span style="font-family:KaiTi_GB2312;font-size:14px;">local test = MyClass:create()
print("the first cocos bind lua result "..test:foo(2))</span>
发现输出了我们要的答案。这样就完成了cocos自定义类绑定到lua中了。
相关文章推荐
- Cocos2dx播放mp4文件(IOS和Android)
- COCOS2D-JS的屏幕适配方案
- CocoStudio:ImageView分析
- [转]cocos2dx中用外部浏览器打开url
- Cocos2d-x能够实现的效果总结
- Agar 流体效果的 Cocos2d-JS 实现
- Cocos2dx_背景层循环滚动
- 在cocos2d-x在CCTableView使用控制
- 9秒学院总结Cocos2d-X面试题
- Eclipse编译调试Cocos2d问题汇总
- Cocos2dx_视觉差效果层ParallaxNode
- 火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第三节:3D摄像机
- 9秒学院总结Cocos2d-X面试题
- Cocos2d-x问题纪录:removeChild和附有PhysicsBody的csb动画
- Cocos2d-js中Chipmunk引擎
- Cocos2d-x学习笔记(五)仿真树叶飘落效果的实现(精灵旋转、翻转、钟摆运动等综合运用)
- cocos2dx——lua自动和手动绑定
- Cocos中有关九宫格的解释
- Cocos2dx创建碰撞刚体
- Cocos2d-x 中与内存管理有关的宏