Quick-Cocos2d-x 3.3加载Spine问题总结

2015年03月16日 12:05 0 点赞 0 评论 更新于 2025-11-21 17:11

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

1、Spine版本问题

Quick-Cocos2d-x 3.3集成的Spine版本并非官方最新版本,这可能会导致一些奇怪的问题。因此,建议使用Spine在GitHub上的最新版本,且版本替换相对容易。

具体操作步骤如下:

  1. 先下载Spine-runtimes。
  2. 拷贝以下文件夹下的文件:
    • 【1】spine-c/src/spine 下的所有文件。
    • 【2】spine-c/include/spine 下的所有文件。
    • 【3】spine-cocos2dx/3/src/spine 下的所有文件。
  3. 将Quick-Cocos2d-x 3.3官方目录下所有Spine相关文件覆盖。
  4. 使用VS重新编译项目,这样在C++版本下就可以使用最新版的Spine功能了。

2、导出Spine功能到Lua脚本

前面提到的是在C++版本下使用Spine,但我们使用的是Quick-Cocos2d-x框架,需要用到Lua代码,因此这里要介绍一下Spine的tolua问题。

参考资料

操作步骤

  1. 打开项目文件下 framework/cocos2d-x/tools/tolua 目录,可以看到一堆 .ini 文件,这些都是需要导出的Spine代码函数。重点关注 genbindings.pyREADME.mdown
  2. README.mdown 是帮助文件,其中重点提到,在Windows平台使用Tolua工具需要安装以下工具:
    • Python2.7.3
    • 安装Python插件:pyyaml
    • 安装Python插件:pycheetah
    • 安装并设置Android-ndk-r9b,并设置 NDK_ROOT 路径
  3. 安装完成后,双击 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 调度。

作者信息

boke

boke

共发布了 3994 篇文章