2dx动画禁止重复 cocos_cocos2dx 帧动画转 gif 动画功能 - CSDN
  • cocos2d-js如何关闭转屏

    2015-10-17 09:20:33
    cocos2d-js如何关闭转屏 如何用户开启转屏功能 如何强制竖屏 不让手机随重力感应转屏
  • [A-A+ lareina 2014 年 7 月 25 日 暂无评论 2485...骨骼动画编辑器——SpineSpine动画的使用 任珊原创,首发于泰然,转载请注明出处 https://github.com/chukong/cocos-docs/blob/master/manual/framework

    [A-A+

    文章目录

    任珊原创,首发于泰然,转载请注明出处

    https://github.com/chukong/cocos-docs/blob/master/manual/framework/native/v3/spine/zh.md

    欢迎大家斧正错误,提交PR。

    Cocos2d-x官方中文文档 v3.x

    游戏中人物的走动,跑动,攻击等动作是必不可少,实现它们的方法一般采用帧动画或者骨骼动画。

    帧动画与骨骼动画的区别在于:帧动画的每一帧都是角色特定姿势的一个快照,动画的流畅性和平滑效果都取决于帧数的多少。而骨骼动画则是把角色的各部分身体部件图片绑定到一根根互相作用连接的“骨头”上,通过控制这些骨骼的位置、旋转方向和放大缩小而生成的动画。

    它们需要的图片资源各不相同,如下分别是帧动画和骨骼动画所需的资源图: 
     

    骨骼动画比传统的逐帧动画要求更高的处理器性能,但同时它也具有更多的优势,比如:

    • 更少的美术资源: 骨骼动画的资源是一块块小的角色部件(比如:头、手、胳膊、腰等等),美术再也不用提供每一帧完整的图片了,这无疑节省了资源大小,能为您节省出更多的人力物力更好的投入到游戏开发中去。
    • 更小的体积: 帧动画需要提供每一帧图片。而骨骼动画只需要少量的图片资源,并把骨骼的动画数据保存在一个 json 文件里面(后文会提到),它所占用的空间非常小,并能为你的游戏提供独一无二的动画。
    • 更好的流畅性: 骨骼动画使用差值算法计算中间帧,这能让你的动画总是保持流畅的效果。
    • 装备附件: 图片绑定在骨骼上来实现动画。如果你需要可以方便的更换角色的装备满足不同的需求。甚至改变角色的样貌来达到动画重用的效果。
    • 不同动画可混合使用: 不同的骨骼动画可以被结合到一起。比如一个角色可以转动头部、射击并且同时也在走路。
    • 程序动画: 可以通过代码控制骨骼,比如可以实现跟随鼠标的射击,注视敌人,或者上坡时的身体前倾等效果。

    骨骼动画编辑器——Spine

    Spine是一款针对游戏的2D骨骼动画编辑工具,它具有良好的UI设计和完整的功能,是一个比较成熟的骨骼动画编辑器。Spine旨在提供更高效和简洁的工作流程,以创建游戏所需的动画。

    使用Spine创建骨骼动画分两大步骤:

    1. 在SETUP模式下,组装角色部件,为其绑定骨骼;
    2. 在ANIMATE模式下,基于绑定好的骨骼创建动画。

    下面简单介绍下具体步骤,更多详细内容请查看官方网站教程:Spine快速入门教程

    1)在SETUP模式下,选中Images属性,导入所需图片资源所在文件夹,其中路径名和资源名中不能出现中文,否则解析不了; 
    2)拖动Images下的图片到场景,对角色进行组装(把各个身体部位拼在一起),可通过Draw Order属性调整图片所在层的顺序; 
    3)创建骨骼,并绑定图片到骨骼上,要注意各骨骼的父子关系。 
    4)切换到ANIMATE模式,选中要“动”的骨骼,对其进行旋转、移动、缩放等操作,每次改动后要记得打关键帧。 
    5)在菜单栏找到Texture Packer项,对角色纹理进行打包,资源文件后缀为atlas(而非Cocos2d-x常用的plist)。打包后将生成两个文件,即:png 和 atlas。 
     
    6)导出动画文件Json。

    Spine动画的使用

    Cocos2d-x程序中,使用Spine动画首先需要包含spine的相关头文件。

    include <spine/spine-cocos2dx.h>
    include "spine/spine.h"
    using namespace spine;

    其常用方法如下:

    创建一个Spine动画对象,将动画文件和资源文件导入。

    auto skeletonNode = new SkeletonAnimation("enemy.json", "enemy.atlas");

    骨骼动画往往是不止一个动画的,例如:当人物需要行走时,就设置播放动画为行走;当要发动攻击时,就设置播放动画为攻击。下面方法可以设置当前播放动画,其中参数false表示不循环播放,true表示循环播放。

    skeletonNode->setAnimation(0, "walk", true);

    setAnimation方法只能播放一种动画,所以当要连续播放不同的动画时,需要使用addAnimation方法来实现,它可以一条一条的播放不同的动画。

    skeletonNode->addAnimation(0, "walk", true);
    skeletonNode->addAnimation(0, "attack", false);

    对于一般情况下,动画的切换要求两个动画完全能衔接上,不然会出现跳跃感,这个对于美术来说要求很高,而Spine加了个动画混合的功能来解决这个问题。使得不要求两个动画能完全的衔接上,比如上面的walk和attack动画, 就是衔接不上的,直接按上面的办法播放,会出现跳跃,但是加了混合后,看起来就很自然了。哪怕放慢10倍速度观察,也完美无缺。这个功能在序列帧动画时是无法实现的,也是最体现Spine价值的一个功能。

    skeletonNode->setMix("walk", "attack", 0.2f);
    skeletonNode->setMix("attack", "walk", 0.4f);

    设置动画的播放快慢可通过设置它的timeScale值来实现。

    skeletonNode->timeScale = 0.6f;

    设置是否显示骨骼通过设置debugBones,true表示显示,false表示隐藏。

    skeletonNode->debugBones = true;

    例子:创建一个player行走和攻击的动画, 并且循环播放。

    auto skeletonNode = new SkeletonAnimation("enemy.json", "enemy.atlas");
    skeletonNode->setMix("walk", "attack", 0.2f);
    skeletonNode->setMix("attack", "walk", 0.4f);
    
    skeletonNode->setAnimation(0, "walk", false);
    skeletonNode->setAnimation(0, "attact", false);
    skeletonNode->addAnimation(0, "walk", false);
    skeletonNode->addAnimation(0, "attact", true);
    
    skeletonNode->debugBones = true;
    
    Size windowSize = Director::getInstance()->getWinSize();
    skeletonNode->setPosition(Point(windowSize.width / 2, windowSize.height / 2));
    addChild(skeletonNode);

    效果图: 

    [Cocos2d-x v3.x官方文档]骨骼动画详解-Spine》若为泰然网原创(翻译),禁止用于一切商业行为,转载请注明出处并通知泰然网!

    展开全文
  • CocosCreator的节点显示和隐藏

    千次阅读 2019-08-11 17:42:08
    1.禁止节点node的运行,方法是x.node.active=false[此时隐藏了节点,且节点不再运行];恢复节点正常运行,x.node.active=true;或者使用x.node.active = !x.node.active 2.第二种,是改变该节点的不透明度,更改了...

    隐藏和显示有两种方式:

    1.禁止节点node的运行,方法是x.node.active=false[此时隐藏了节点,且节点不再运行];恢复节点正常运行,x.node.active=true;或者使用x.node.active = !x.node.active

    2.第二种,是改变该节点的不透明度,更改了透明度只是看不到,但node上的脚本还在正常运行;方法是x.node.opacity=0;//透明,此时看不到;x.node.opacity=255;//完全不透明,此时显示;

     栗子:

    两者使用是有区别的,

    见下图,是使用的第二个方法,此时只需要将节点的Opacity的值设为0 ,程序运行到此处,该节点自会显示出来;

    转载于:https://www.cnblogs.com/allyh/p/9520903.html

    展开全文
  • 概述:虽然我们已经会使用静态的UI控件了,但还远远不够,接下来我们再研究一下动画的使用...... 先上图:

    1、概述

         现在我们已经会使用静态的UI控件了,接下来我们再研究一下动画的使用。

        效果图:

     


     

    2、创建资源层

        打开CocoStudio,这次在初始界面上选择”AnimationEditor”(第一个)进入编辑器并创建一个新项目:MyAnimation。 

        将一些图片资源添加到Resource文件夹中,这样我们就可以使用更多的元素了。

        将资源面板中的图片拖动到渲染工作区,并在对象结构中重命名为:first。


     

     

        点击左上角的“形体模式”,这样就能进入动画模式编辑。

        但当我们进入动画模式时发现什么都看不到,好像是没有添加。经研究发现,如果未绑定骨骼,是无法在动画模式中进行预览的。所以我们要回去绑定骨骼。点击“动画模式”,回到刚才的界面。然后我发现,刚才编辑的控件也没了。但是对象结构中的“first”还在。将资源中的图片拖动到“渲染资源”上,就显示出来了。估计可能有点小问题。

    3、创建骨骼

        点击“创建骨骼”,然后在工作区上的元素处点击,注意不要拖动。

     


     

        我们会发现创建了一个对象结构,并且在工作区中上出现了一个十字星。我们将其改名为:Bone1


     

        再次点击“创建骨骼”按钮,切换回摆放模式。接下来右击图片,在弹出的菜单中选择绑定到骨头。然后点击那个十字星。会弹出一个提示,我感觉这个提示语不明所以,估计就是说不能重复添加的意思。明明是添加成功了,好歹也说添加成功啊,看到“不能…”字样,搞的我以为弄错了,查了好半天。




        绑定完成后我们会发现对象结构中的first已经没有了,合并成了一个Bone1。可见此处不绑定骨头的元素是不被认可的。希望未来的版本能在切换模式的时候增加一个提示,哪些未绑定到骨骼,以及将引起什么现象。

     

        我们先不忙切换模式,再创建一个元素,此处的不同处是我们要拖动骨骼,并绑定:




    4、编辑动画

        点击“形体模式”,切换到“动画模式”。我们先将动作列表中的默认动作改个名:hit。然后就制作一个动画吧,很简单,跟flash差不多。编辑好了大致是这样:


     


        我们可以点击播放来看动画效果。

    5、导出

        在文件->导出项目中,将文件导出。依照默认选项就成。

     

    6、总结

        使用CocoStudio,可以方便的创建动画并导出,可大幅简化与美术方面的开发与沟通成本,也加速了项目的开发。虽然目前还有些细节做的不完善,但对大家已经有很大的帮助了,希望大家能摆正心态看待。毕竟它的进步还需要我们的反馈与支持。

     

        本篇博客出自阿修罗道,转载请注明出处,禁止用于商业用途http://blog.csdn.net/fansongy/article/details/12858501  



    展开全文
  • 在spine官方提供的代码中,没有提供动画文件的缓存处理,当同时加载多个动画的时候会卡帧(例如你的游戏中背包里有30个物品,每个物品都有一个相同的...首先找到cocos2dx的spine库,通常在cocos2d/cocos/editor-support/.

    在spine官方提供的代码中,没有提供动画文件的缓存处理,当同时加载多个动画的时候会卡帧(例如你的游戏中背包里有30个物品,每个物品都有一个相同的特效),
    动画数据数量越大,卡得越厉害。为此,我们需要对官方提供的代码做一些优化,经测试加100个相同动画和加载一个动画没有区别,效率提高99.99%:
    测试代码:创建200个相同动画 在这里插入图片描述
    在这里插入图片描述
    效果: 200百个动画瞬间加载完成,适用于场景中有大量且相同的动画,例如游戏中的背包有50个格子,每个格子上都有一个spine特效

    步骤:
    (注:可以把下面的代码类声明和实现都写在 namespace spine里面,这样和官方代码格式统一)
    首先找到cocos2dx的spine库,通常在cocos2d/cocos/editor-support/spine路径下。
    在vs工程里默认有4个项目:(libcocos2d; librecast; libspine; 还有一个就是你的项目了) 。在libspine项目下就是整个spine库的代码了。
    1.找到skeletonRender.h文件并在里面添加一个缓存的单例类
    
        class SpineDataCache
        {
            static SpineDataCache* m_Instance;                //单例模式
            std::unordered_map<std::string, spSkeletonData*> _mSkeletonData;//<spine文件路径,骨骼数据>
        
            explicit SpineDataCache();                //前面的关键字是禁止SpineDataCache隐式调用,也就是防止用这个类直接创建对象
        public:
            static SpineDataCache* getInstance();
            ~SpineDataCache();
            bool put(spSkeletonData* skeletonData, const std::string& key);
            spSkeletonData* get(const std::string& key);
            void clear();//清理缓存,我们在当游戏结束时手动来清理缓存的那些二进制文件了
        
        };    
    
    2. 然后实现上面给出类 skeletonRender.cpp文件加入如下代码    
    
        SpineDataCache* SpineDataCache::m_Instance = NULL;
        
        SpineDataCache::SpineDataCache()
        {
        
        }
        SpineDataCache::~SpineDataCache()
        {
        
        }
        SpineDataCache* SpineDataCache::getInstance()
        {
            if (m_Instance == NULL)
            {
                m_Instance = new SpineDataCache();
            }
            return m_Instance;
        }
    
    //这里采用骨骼数据和对应的文件路径作为Key值储存在map中:当逻辑代码里传入一个文件路径,就去缓存中找对应的骨骼数据。
    
    这个函数是缓存
    bool SpineDataCache::put(spSkeletonData* skeletonData, const std::string& key)
    {
        auto iter = _mSkeletonData.find(key);
        if (iter != _mSkeletonData.end())
            return true;
        _mSkeletonData.insert(std::make_pair(key, skeletonData));
        return true;
    }
    
     这个函数是取出
    spSkeletonData* SpineDataCache::get(const std::string& key)
    {
        auto iter = _mSkeletonData.find(key);
        if (iter != _mSkeletonData.end())
            return iter->second;
        return NULL;
    }
    
    //注意退出游戏 或者切换场景或者不需要缓存动画数据的时候要手动清理掉缓存的数据
    void SpineDataCache::clear()
    {
        for (auto iter = _mSkeletonData.begin(); iter != _mSkeletonData.end(); ++iter)
        {
            spSkeletonData* _skelonData = iter->second;
            spSkeletonData_dispose(_skelonData);
        }
        _mSkeletonData.clear();
    }
    
    上面是新加的代码,用于缓存骨骼文件,下面才是和官方的代码交互以及回收内存!!!
    

    为了实现skeletonData通过引用计数来回收,在SkeletonData类中 加入包含文件:
    #include “cocos2d.h”
    同时让SkeletonData类继承引用计数的基类Ref(这里就是继承多个类)
    在这里插入图片描述
    在SkeletonRenderer.h中添加一个私有成员变量 _skeletonDataFile 用来记录骨骼文件名,并在两个initWithBinaryFile函数中赋值(下面的代码中已经写了)

    在这里插入图片描述
    在这里插入图片描述

      3.写好了上面的缓存类,接下来要把这个缓存逻辑加入到官方给的代码中去, 
      修改skeletonRender.cpp中initWithBinaryFile函数(这个函数是初始化骨骼数据)
    	void SkeletonRenderer::initWithBinaryFile (const std::string& skeletonDataFile, spAtlas* atlas, float scale)
    {
        _skeletonDataFile = skeletonDataFile;
        _atlas = atlas;
        _attachmentLoader = new (__FILE__, __LINE__) Cocos2dAtlasAttachmentLoader(_atlas);
    
        SkeletonBinary binary(_attachmentLoader);
        binary.setScale(scale);
        //先去缓存找,如果找不到再加载atlas文件和skel文件解析出骨骼数据。
        //然后将(spSkeletonData类型)骨骼数据放入缓存(对比看一下官方的和下面的代码有何不同)
        SkeletonData* skeletonData = SpineDataCache::getInstance()->get(skeletonDataFile);
        if (skeletonData == NULL)
        {
            SkeletonBinary binary(_attachmentLoader);
            binary.setScale(scale);
            skeletonData = binary.readSkeletonDataFile(skeletonDataFile.c_str());
            CCASSERT(skeletonData, !binary.getError().isEmpty() ? binary.getError().buffer() : "Error reading skeleton data.");
            SpineDataCache::getInstance()->put(skeletonData, skeletonDataFile);
        }
        _ownsSkeleton = true;
        setSkeletonData(skeletonData, true);
        skeletonData->retain();
        initialize();
        }
    }
    
    void SkeletonRenderer::initWithBinaryFile (const std::string& skeletonDataFile, const std::string& atlasFile, float scale) {
    	_skeletonDataFile = skeletonDataFile;
    	_atlas = new (__FILE__, __LINE__) Atlas(atlasFile.c_str(), &textureLoader, true);
    	CCASSERT(_atlas, "Error reading atlas file.");
    
    	_attachmentLoader = new (__FILE__, __LINE__) Cocos2dAtlasAttachmentLoader(_atlas);
    	SkeletonData* skeletonData = SpineDataCache::getInstance()->get(skeletonDataFile);
    	if (skeletonData == NULL)
    	{
    		SkeletonBinary binary(_attachmentLoader);
    		binary.setScale(scale);
    		skeletonData = binary.readSkeletonDataFile(skeletonDataFile.c_str());
    		CCASSERT(skeletonData, !binary.getError().isEmpty() ? binary.getError().buffer() : "Error reading skeleton data.");
    		SpineDataCache::getInstance()->put(skeletonData, skeletonDataFile);
    	}
    	_ownsSkeleton = true;
    	_ownsAtlas = true;
    	setSkeletonData(skeletonData, true);
    	skeletonData->retain();
    	initialize();
    }
    
    4.修改skeletonRender.cpp中~SkeletonRenderer析构函数
    //官方给的代码里逻辑是每次一个动画被从父节点删除就会在析构函数里释放骨骼数据。然而我们并不希望他每次都删除,
    因为一旦删除了我们下次加载同样的spine动画就要重新加载了,而且我们缓存的所有相同动画共享同一份骨骼数据,所以不能在这里删除。
     一旦删除其他动画再调用析构函数就内存泄漏了,理所当然这里不删除骨骼数据。所以我们注释掉下面这行原有的代码。
     
    SkeletonRenderer::~SkeletonRenderer () 
    {
    	auto skeletonData = SpineDataCache::getInstance()->get(_skeletonDataFile);
    	if (skeletonData)
    	{
    		//这里原来是getData, 被我们注释了,getData返回的值就是我们缓存的skeletonData,我们希望不是直接删除它,而是做计数处理,既然是析构函数,那我们需要release一次。
    		如果getReferenceCount返回1, skeletonData->release中就被释放了缓存,紧接着就要删除_skeleton。这样我们把缓存的skeletonData和与之关联的_skeleton变量都释放了。
    		unsigned int refCount = skeletonData->getReferenceCount();
    		skeletonData->release();
    		if (refCount == 1)//由于
    		{
    			if (_ownsSkeleton) delete _skeleton;
    		}
    	}
    	//if (_ownsSkeletonData) delete _skeleton->getData();
    	//if (_ownsSkeleton) delete _skeleton;
    	if (_ownsAtlas && _atlas) delete _atlas;
    	if (_attachmentLoader) delete _attachmentLoader;
    	delete _clipper;
    }
    

    最后:骨骼数据存在上面我们写的的spineCache中。应该当退出游戏的时候手动调用SpineDataCahce::clear()清除一下这个map表。

    源文件下载地址: https://download.csdn.net/download/zhang1461376499/12546292

    展开全文
  • cocos2dx 自带库 spine v2.x缓存优化方案

    千次阅读 2020-06-23 10:25:48
    在spine官方提供的代码中,没有提供动画文件的缓存处理,当同时加载多个动画的时候会卡帧,动画数据数量越大,卡得越厉害。为此,我们需要对官方提供的代码做一些优化: (注:可以把下面的代码类声明和实现都写在 ...
  • 测试时候发现的问题,比如有些较长的过长
  • 最近几天仔细了解了iOS游戏开发引擎,常用的cocos2d,Unity引擎,那么Unity是非免费的,而cocos2d则是免费开源的; 最后促使我选择cocos2d的原因有两点: 1.最重要的原因是它对应的开发工具,尤其是 ...
  • 最近几天仔细了解了iOS游戏开发引擎,常用的cocos2d,Unity引擎,那么Unity是非免费的,而cocos2d则是免费开源的; 最后促使我选择cocos2d的原因有两点: 1.最重要的原因是它对应的开发工具,尤其是 ...
  • iOS 游戏开发 博客

    2019-08-05 17:32:27
    1....最近几天仔细了解了iOS游戏开发引擎,常用的cocos2d,Unity引擎,那么Unity是非免费的,而cocos2d则是免费开源的; 最后促使我选择cocos2d的原因...
  • Cocos2d-x 30开发六使用cocoStudio创建一个骨骼动画 曲线动画总结 1、概述  最新版本的CocoStudio在修复之前Bug的同时,加入了新功能,粒子挂载和曲线动画就是其中的亮点。下面我们就动手做个例子...
  • Cocos2d-x 如何暂停界面

    千次阅读 2014-06-10 15:33:53
    很多游戏,暂停界面是少不了,介于最近在
  • 李华明Himi 原创,转载务必在明显处注明:转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-cocos2d/507.html 本章节主要为大家介绍在游戏开发过程中经常遇到的两个问题; 1. 解决滚屏背景...
1 2 3 4 5 ... 20
收藏数 1,479
精华内容 591
关键字:

2dx动画禁止重复 cocos