Quick-Cocos2d-x 3.3加载Spine问题总结
最近项目要升级到Quick-Cocos2d-x 3.3,并且使用了Spine作为动画编辑器,在升级过程中遇到了一些问题,特此进行整理,将有关Quick-Cocos2d-x 3.3加载Spine时遇到的问题记录如下。
1、Spine版本问题
Quick-Cocos2d-x 3.3集成的Spine版本并非官方最新版本,这可能会导致一些奇怪的问题。因此,建议使用Spine在GitHub上的最新版本,且版本替换相对容易。
具体操作步骤如下:
- 先下载Spine-runtimes。
- 拷贝以下文件夹下的文件:
- 【1】
spine-c/src/spine下的所有文件。 - 【2】
spine-c/include/spine下的所有文件。 - 【3】
spine-cocos2dx/3/src/spine下的所有文件。
- 【1】
- 将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-binding有所描述,在此不再赘述。
操作步骤
- 打开项目文件下
framework/cocos2d-x/tools/tolua目录,可以看到一堆.ini文件,这些都是需要导出的Spine代码函数。重点关注genbindings.py和README.mdown。 README.mdown是帮助文件,其中重点提到,在Windows平台使用Tolua工具需要安装以下工具:- Python2.7.3
- 安装Python插件:
pyyaml - 安装Python插件:
pycheetah - 安装并设置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 文件,可以找到如下代码:
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 调度。