最近因为项目要升级到Quick-Cocos2d-x 3.3, 并且使用了Spine作为动画编辑器, 升级过程中遇到一些问题,特此整理一下,把有关Quick-Cocos2d-x 3.3加载Spine遇到的问题在此记录一下。


1、Spine版本问题 

首先Quick-Cocos2d-x 3.3集成的版本并非是官方最新版本, 于是这就有可能会遇到一些比较奇怪的问题, 所以在这里建议最好使用Spine在github上最新版本,版本的替换也是相当容易。

先下载Spine-runtimes,拷贝如下文件夹下的文件。 

【1】spine-c/src/spine 下所有文件 

【2】spine-c/include/spine下所有文件 

【3】spine-cocos2dx/3/src/spine 下所有文件 

将Quick-Cocos2d-x 3.3官方下的所有Spine下的文件覆盖 

此时,用VS重编项目,这样,在C++版本下,就可以使用最新版的Spine功能了


2、导出Spine功能到Lua脚本 

上面说的是在C++版本下使用Spine, 但是我们用的Quick-Cocos2d-x框架,需要用到Lua代码,这里就要讲一下Spine的tolua问题了。

首先,请参考一下这篇文章:更新Cocos2d-x 3.2 Spine runtime运行库到2.1以及相关lua binding的更新

以及书籍《我所理解的Cocos2d-x》第18章也对Lua-bindinge 有所描述,在此不重复讲。 

打开项目文件下 framework/cocos2d-x/tools/tolua下,可以看到一堆。*.ini文件,这些都是需要导出的Spine代码函数,这里重点关注一下【genbindings.py】、【README.mdown】 

readme.mdown是帮助文件,里面重点讲到,使用Tolua工具在window平台, 需要安装如下工具: 

1、Python2.7.3 

2、安装Python插件:pyyaml 

3、安装Python插件:pycheetah 

4、安装并设置Android-ndk-r9b, 并设置NDK_ROOT路径

安装完了之后,双击genbindings.py就可以生成供Lua使用的Spine代码了。


3、注意事项 

Quick-Cocos2d-x 3.3将一些Spine代码重新命名了, 在framework/cocos2d-x/cocos/scripting/lua-binding/manual/spine 

打开lua_cocos2dx_spine_manual.cpp文件,可以在里面找到这么一段代码: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static void extendCCSkeletonAnimation(lua_State* L) 
lua_pushstring(L, “sp.SkeletonAnimation”); 
lua_rawget(L, LUA_REGISTRYINDEX); 
if (lua_istable(L,-1)) 
tolua_function(L, “create”, lua_cocos2dx_CCSkeletonAnimation_createWithFile); 
tolua_function(L, “registerSpineEventHandler”, tolua_Cocos2d_CCSkeletonAnimation_registerSpineEventHandler00); 
tolua_function(L, “unregisterSpineEventHandler”, tolua_Cocos2d_CCSkeletonAnimation_unregisterSpineEventHandler00); 
tolua_function(L, “setBlendFunc”, tolua_spine_SkeletoneAnimation_setBlendFunc); 
tolua_function(L, “addAnimation”, lua_cocos2dx_spine_SkeletonAnimation_addAnimation); 
tolua_function(L, “setAnimation”, lua_cocos2dx_spine_SkeletonAnimation_setAnimation); 
lua_pop(L, 1);
Because sp.SkeletonAnimation:create creat a LuaSkeletonAnimation object,so we need use LuaSkeletonAnimation typename for g_luaType*/
    std::string typeName = typeid(LuaSkeletonAnimation).name();
    g_luaType[typeName] = "sp.SkeletonAnimation";
    g_typeCast["SkeletonAnimation"] = "sp.SkeletonAnimation";
}

关键看tolua_function,可以看到将createWithFile更换为create, 注册脚本事件为registerSpineEventHandler


4、关于回调 

切记不要在事件回调中,删除Spine节点对象, 因为删除自身之后, 后续还会有其他操作。 

我的做法是:在update中,设置一个是否可以删除标记, 根据标记来判断是否删除spine节点对象,而事件响应回调函数中, 则是设置标记的。

至于Lua中,使用update, 可以使用Schedule调度.