使用lua实现Spine动画的预加载
创建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动画的预加载的更多相关文章
- cocos2x (c++/lua) spine 文件的预加载
在之前,笔者写过一编博客,通过lua在加载场景加载spineAnimation动画精灵,保存在table中,然后在游戏中创建动画精灵时,提取加载好的spineAnimaiton中的 spSkeleto ...
- spine实现预加载(一)
前言 本文实现了spine动画的预加载,解决在战斗等大量加载spine动画的时候出现卡顿现象. 这里使用和修改三个类,直接修改的源码,当然你也可以继承LuaSkeletonAnimation,自己封装 ...
- 如何使用SVG生成超酷的页面预加载素描动画效果
在线演示 本地下载 1 SVG简介 可缩放矢量图形是基于可扩展标记语言(标准通用标记语言的子集),用于描述二维矢量图形的一种图形格式.它由万维网联盟制定,是一个开放标准. 2 SVG的特点 与其他图像 ...
- 页面预加载loading动画,再载入内容
默认情况下如果网站请求速度慢,所以会有一段时间的空白页面等等,用户体验效果不好,见到很多的页面都有预加载的效果,加载之前先加载一个动画,后台进程继续加载页面内容,当页面内容加载完之后再退出动画显示内容 ...
- 发光加载环动画-纯CSS动画效果-如何创建CSS3旋转预加载器(参照https://www.bilibili.com/video/BV1V4411C7z5?from=search&seid=9741275927942612817)
//css部分 body{ margin:; padding:; background: #262626; } .ring{ position: absolute; top:50%; left: 50 ...
- Javascript图片预加载详解
预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...
- Javascript实现图片预加载【回调函数,多张图片】
使用JS实现一组图片动画效果或者使用HTML5 Canvas渲染一系列图片等案例中,需要图片全部加载完成方可运行动画效果.此时程序中就会涉及多张图片预加载代码.当接二连三的案例中都涉及图片预加载时,就 ...
- 使用 SVG 实现一个漂亮的页面预加载效果
今天我们要为您展示如何使用 CSS 动画, SVG 和 JavaScript 创建一个简单的页面预加载效果.对于网站来说,这些预载入得画面提供了一种创造性的方法,使用户在等待内容加载的时候不会那么无聊 ...
- javascript图片懒加载与预加载的分析
javascript图片懒加载与预加载的分析 懒加载与预加载的基本概念. 懒加载也叫延迟加载:前一篇文章有介绍:JS图片延迟加载 延迟加载图片或符合某些条件时才加载某些图片. 预加载:提前加载图片, ...
随机推荐
- angular实现表格的全选、单选、部分删除以及全部删除
昨天自己写了一小段js,在全选的时候有点儿小坑,然后,整理了一下.今天把它贴出来,希望以后还记得. 大家也可以去github上查看或下载:https://github.com/dreamITGirl/ ...
- 取消eclipse英文单词拼写验证
依次点击Preferences->General->Editors->TexEditors->Spelling->Enable Spell Checkingt , 如下图 ...
- Jmeter 的 vars 和 props 用法
meter 的 JSR223 控件是 代替 BeanShell 的新一代脚本控件,支持多种脚本语言,尤其是其中的 Groovy,更是重点推荐使用的脚本语言,本文研究其中的 vars 和 props 两 ...
- jQuery基础(3)
摘要:jQuery的位置信息,JS的事件流的概念(重点),事件对象,jQuery的事件绑定和解绑,时间委托(时间代理) 一.jQuery的位置信息 jQuery的位置信息跟JS的client系列.of ...
- Spark Mllib里的Mllib基本数据类型(图文详解)
不多说,直接上干货! Spark Mllib基本数据类型,根据不同的作用和应用场景,分为四种不同的类型 1.Local vector : 本地向量集,主要向spark提供一组可进行操作的数据集合 2 ...
- 获取spring里的bean
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring. ...
- 报错:Could not reserve enough space for object heap error
windows命令行运行某个命令时出现: 解决办法: 设置开始->控制面板->系统和安全->系统->高级系统设置->环境变量->系统变量->新建: 变量名: ...
- 定时器 & 日期时间对象 & 正则
1 JavaScript 计时事件 通过使用 JavaScript,有能力做到在一个设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行,这称之为计时事件. 两个关键方法是: setInterv ...
- mongodb关联查询 和spring data mongodb
GITHUB:https://github.com/peterowang/Springdata-mongo 使用DBRefs DBRefs中有三个字段 - $ref - 此字段指定引用文档的集合 $i ...
- cf1027F. Session in BSU(并查集 匈牙利)
题意 题目链接 $n$个人,每个人可以在第$a_i$天或第$b_i$,一天最多考一场试,问在最优的情况下,最晚什么时候结束 Sol 自己只能想到暴力匈牙利二分图匹配,然而还是被构造数据卡了.. 标算很 ...