• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

创建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)

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
lua类实现发布时间:2022-07-22
下一篇:
lua协程并发下载简单测试发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap