使用lua实现Spine动画的预加载

摘要:
CreateWithFile通过加载动作数据立即创建。如果spine动画中的json文件大小超过100k,则会卡住。如果动画文件太小,可以使用此方法创建动画。CreateWithData通过预加载将动画数据保存在spSkeletonData中,然后通过实现创建动画。当脊椎动画太大时,可以使用此方法。cocos2dx附带的LucaSkeletonAnimation文件没有实现createWithData。所以我选择继承SkeletonAnimation来覆盖这个方法。

创建spine动画有两种方法,分别是createwithfile和createwithdata。

createWithFile是通过加载动作数据马上进行创建,如果spine动画中的json文件大小超过100k时,会出现卡顿现象,如果动画文件偏小,可以使用这个方法来创建动画。

createWithData是通过预加载,保存动画数据在spSkeletonData中,然后通过实现创建动画,这个方法可以使用在spine动画偏大的情况下使用。

cocos2dx 自带的LuaSkeletonAnimation文件中没有对createWithData进行实现,所有,我选择继承SkeletonAnimation来重写该方法。

实现方法如下:

 (SpineAnimation_new.h)

#include <stdio.h>

#include "cocos/editor-support/spine/SkeletonAnimation.h"

#include "cocos/editor-support/spine/spine.h"

#include "spine/SkeletonRenderer.h"

#include "cocos2d.h"

using namespace spine;

class SpineAnimation_new:spine::SkeletonAnimation

{

public:

    static SpineAnimation_new *createWithSkeletonData(spSkeletonData* skeletonData);

    static SpineAnimation_new *createWithSkeletonAnimation(SpineAnimation_new*skeletonAnim);

    static SpineAnimation_new *createWithFileName(const std::string& skeletonDataFile, const std::string& atlasFile, float scale = 1);

    virtual ~SpineAnimation_new();

    spSkeletonData* getSkeletonData()

    {

        spSkeletonData*skData =SkeletonRenderer::getSkeleton()->data;

        return skData;

    }

private:

    SpineAnimation_new(spSkeletonData*skeletonData);

    SpineAnimation_new(const std::string& skeletonDataFile, const std::string& atlasFile, float scale = 1);

};

(SpineAnimation_new.cpp)

#include "SpineAnimation_new.h"

#include "cocos2d.h"

#include "cocos/scripting/lua-bindings/manual/cocos2d/LuaScriptHandlerMgr.h"

#include "CCLuaStack.h"

#include "CCLuaEngine.h"

USING_NS_CC;

SpineAnimation_new *SpineAnimation_new::createWithSkeletonData(spSkeletonData* skeletonData)

{

    SpineAnimation_new* node = new (std::nothrow)SpineAnimation_new(skeletonData);

    node->autorelease();

    return node;

}

SpineAnimation_new *SpineAnimation_new::createWithSkeletonAnimation(SpineAnimation_new*skeletonAnim)

{

    SpineAnimation_new* node = new (std::nothrow)SpineAnimation_new(skeletonAnim->getSkeletonData());

    node->autorelease();

    return node;

}

SpineAnimation_new *SpineAnimation_new::createWithFileName(const std::string& skeletonDataFile, const std::string& atlasFile, float scale)

{

    SpineAnimation_new* node = new (std::nothrow)SpineAnimation_new(skeletonDataFile, atlasFile, scale);

    node->autorelease();

    return node;

}

SpineAnimation_new::~SpineAnimation_new()

{

    ScriptHandlerMgr::getInstance()->removeObjectAllHandlers((void*)this);

}

SpineAnimation_new::SpineAnimation_new(spSkeletonData*skeletonData):

SkeletonAnimation(skeletonData)

{

    

}

SpineAnimation_new::SpineAnimation_new(const std::string& skeletonDataFile, const std::string& atlasFile, float scale):SkeletonAnimation(skeletonDataFile,atlasFile,scale)

{

}

在绑定lua的c++代码中,cocos2dx自带的打包工具会出现一下小问题,在栈中获取不了加载好的spine数据,所以要我将读栈方法修改如下:

    argc = lua_gettop(tolua_S) - 1;

    if (argc == 1)

    {

        SpineAnimation_new* arg0 = (SpineAnimation_new*)tolua_tousertype(tolua_S,2,0);

        SpineAnimation_new* ret = SpineAnimation_new::createWithSkeletonAnimation(arg0);

        return 1;

    }

在lua代码中,我先将所有spine动画创建加载,放在一个table中,并且调用retain()方法避免场景切换时被释放,然后在游戏过程中,通过键值获取table中预先创建好的spine动画实现创建。

local spineAnim = cc.SpineAnimation_new:createWithFileName("role/tn_zt/tn_zt.json","role/tn_zt/tn_zt.atlas")--预加载动画资源

 self._sprite3d = cc.SpineAnimation_new:createWithSkeletonAnimation(spineAnim)--创建动画

    self:addChild(self._sprite3d)--添加到当前场景

    self._sprite3d:setPosition(200,200)

通过以上方法就可以实现spine动画的预加载

(转载时请注明出处,from 博客园:HemJohn)

免责声明:文章转载自《使用lua实现Spine动画的预加载》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇docker+Nexus Repository Manager 搭建私有docker仓库JS实现跟随鼠标的魔法文字下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

css3 animation 属性众妙

转自:凹凸实验室(https://aotu.io/notes/2016/11/28/css3-animation-properties/) 本文不会详细介绍每个 css3 animation 属性(需要了解的同学可先移步 MDN),而是结合实际的开发经验,介绍 css3 animation 属性的一些使用场景及技巧。 1. animation-delay...

cocostudio使用plist创建序列帧动画图片名称序列错乱的问题

cocostudio 版本v2.2.9 用texturePacker将动画帧打包成一个plist和一张png,将plist拖入cocostudio中的资源栏中。 如图所示,plist里面的图片顺序是乱掉的,而且该顺序无法调整,10,11应该在最后,这样选择这11张图创建的序列帧动画中间2帧将是错乱的 如果自己手动调整关键帧很麻烦,那么解决问题的地方就在于...

BZOJ 1296 粉刷匠(分组背包套DP)

刚开始往网络流的方向想。建不出图。。。 因为每次只能对一行进行染色。每一行都是独立的。 对于每一行,因为格子只能染一次,所以可以发现这是一个多阶段决策问题,这个决策就是当前格子染0还是染1. 令dp[i][j][k](k==0||k==1)表示当前行第i个格子用了j次染色,且这次染色染为k色 的最多有效格子。 这样我们用了O(n*m*m)得出了每一行用了v...

BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]

传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[i]$表示第$i$天最多能得到的钱在这一天可以换成多少$A$卷 枚举使用哪一天留下的卷,按这一天的汇率换成钱来更新最大钱数 再用这个钱数更新$f[i]$ 这...

eclipse下进行c开发,使用zeromq

使用eclipse开发代码,一段zeromq的代码。 #include <string.h> #include <stdio.h> #include <unistd.h> #include "zmq.h" int main(int argc, char const *argv[]) { void* context...

C/C++读取时间的方法

【摘要】本文介绍C/C++下获取日历时间的方法,区别于JAVA语言的方便,C/C++标准库好像并没有一次性得到具有可读性的HH:MM:SS的方法,本文介绍常用的三步法得出具有可读性的时间,并且介绍了纳秒和微秒的时间获取。 1、对于C语言,需包含的头文件: 1 #include <sys/time.h> 2、获取日期需要先获取日历时间,即1970...