spine导入cocos - CSDN
  • 好久没写教程了,主要是太忙了,最近一直在搞网狐的开发,网狐的代码确实不错,手头上做的棋牌外包,同时遇到要将SPINE动画导入U3D和COCOS,网上一般的使用教程很多的,但是很多坑点没有说到,我把遇到的坑记下来。...

    原创

    好久没写教程了,主要是太忙了,最近一直在搞网狐的开发,网狐的代码确实不错,手头上做的棋牌外包,同时遇到要将SPINE动画导入U3D和COCOS,网上一般的使用教程很多的,但是很多坑点没有说到,我把遇到的坑记下来。本来我自己是动画师出身,做了5年的动画,还挺想玩一下SPINE的,但是很遗憾,盗版只到1.8好像,正版已经3点几了,正版需要2100,肉痛啊。

    一.COCOSLUA 

    1.播放Json动画

    local Node_CarSpine = self:getResourceNode():getChildByName("Node_CarSpine")
    spine_Car = sp.SkeletonAnimation:create("spine/chezi.json","spine/chezi.atlas",1) 
    spine_Car:setAnimation(0, "animation", false)

    坑点: 运行时卡死,没有任何提示。原因是:COCOS版本和SPINE动画的版本不匹配,我当时是COCOS3.17,可以播放3.6.50的动画,但是2点几的带骨骼的动画不行,非骨骼动画可以播放,我用COCOS3.10播放2点几的没问题,3.6.50又不行。网上有工具,大概叫:spine3.0导出文件转换成cocos3.8可使用文件工具

    2.播放Skel动画

    MainScene.spine_Man=sp.SkeletonAnimation:createWithBinaryFile("spine/pumpkin.skel","spine/pumpkin.atlas",1)

    坑点: 运行奔溃,会弹个窗口,大概意思是骨骼信息错误,COCOS3.14以后才有比较好的对Skel动画的支持,原因是:COCOS版本和SPINE运时库不匹配,我的COCOS是3.17的,但是SPINE官方最多weih维护到COCOS 3.16,降级后成功运行。

    二.UNITY3D

    1.播放Json动画

    API我就不写了,好久没用U3D了,网上一大堆教程,主要是把 atlas 文件,改名成 atlas.txt

    2.播放Skel动画

    主要是把 atlas 文件,改名成 atlas.txt    skel 文件,改名成 skel.bytes 

    坑点:加载的时候报错,大概提示数组越界,原因是SPINE运行库和SPINE动画不匹配,更换SPINE库版本。

     

    总结:Skel动画是二进制文件,Json是配置文件,网上有人测试过Skel动画大概快8倍,二进制的东西肯定是性能好的多,但是Skel文件无法明文知道动画名称,U3D里加载就能看见,COCOS里也可以通过 spAnimation** animal = skeletonNode->getSkeleton()->data->animations  获取到动画名,但是COCOSLUA里不行,到data里就获取不到了,我看了下绑定文件没有绑到LUA里去,所以LUA调用不了,只能自己绑定,或者是导入到U3D里面去看了。

    展开全文
  • cocos2dx 中使用spine骨骼动画初探最近在制作一款2D横版游戏,主要使用spine来做骨骼动画。 我用的是1.7版本的破解版spine,大家可以自行百度 刚打开spine就是一个样例:spineboy,我就打算用这个素材。 右边的...

    在cocos2dx 中使用spine骨骼动画初探

    最近在制作一款2D横版游戏,主要使用spine来做骨骼动画。
    我用的是1.7版本的破解版spine,大家可以自行百度
    刚打开spine就是一个样例:spineboy,我就打算用这个素材。
    spine截图

    右边的资源栏有两个Animation,一个是跳(jump),一个是走路(walk),界面左上角有个setup按钮,点击会切换到动作模式,如下图:
    这里写图片描述

    动作模式下方有七个按钮,分别是[返回开始][前一帧][倒放][正放][后一帧][返回最后][循环播放]
    点击循环播放和正放,可以预览动画.

    之后我们点击左上方的logo,出现主菜单,点击导出(export):
    这里写图片描述

    导出格式设置为JSON,导出目录任选,勾选Create Atlas,点击导出
    这里写图片描述

    然后我们就在导出目录看到三个文件.png .atlas和.json
    这里写图片描述

    这三个文件我们拷贝到cocos项目的Resource文件夹中:
    这里写图片描述

    切记,如果要直接使用文件名创建动画对象,那么只能拷贝到Resource根目录下,博主之前把文件拷贝到在这个文件夹下的一个[主角]文件夹,然后运行时就报错.

    回到visual studio,核心代码如下:

    #include "spine\spine-cocos2dx.h"
    bool HelloWorld::init()
    {
        if (!Layer::init())
        {
            return false;
        }
    
        auto skeletonNode =spine::SkeletonAnimation::createWithFile("spineboy.json", "spineboy.atlas",0.2F);//0.2是设置图片的缩放比例
        skeletonNode->setPosition(Point(400, 200));
        skeletonNode->setAnimation(0, "walk", true);//true是指循环播放walk动作
        this->addChild(skeletonNode);
        return true;
    }

    运行之后就是这个小男孩一直在走:

    这里写图片描述

    展开全文
  • Spine使用(With Cocos2d-x)

    2014-03-08 21:00:46
    使用(With Cocos2d-x)   cocos2d-xSpine 目录(?)[+] 介绍Runtime使用 简单的循环动画播放一次动画连续播放动画程序控制的骨骼动画其他功能 慢动作和快动作动画混合 问题 工具使用上Runtime...
    
    使用(With Cocos2d-x)      
       

    介绍

    Spine是一个2D的骨骼动画编辑器, 因为其良好的UI设计及完整的功能, 在kickstarter上发布以后立即收到追捧, 作为一个几乎只有游戏开发者才会使用的小众工具, 募集了远超目标5倍的资金, 共计6.7W多美元. 我在其项目发布后, 成为了Spine在kickstarter的早一批backer, 这是我在kickstarter上第一个, 也是目前唯一一个支持的项目. 随后, 通过不断收到的邮件见证了Spine逐步完善的过程, 直到其发出target完成的邮件. 又过了这么长时间了, 因为手头的项目一直不需要太复杂的2D骨骼动画, 拖着没有研究, 现在也是时候看看Spine了, 可惜的是, Spine的使用还有一系列的视频教学可以参考, 而Spine的Runtime使用完全没有文档, 只有一两个简单的例子. Spine团队的主要精力目前还是放在一些新功能的开发和Runtime的继续支持上, 写文档还排在Next up上.

    Runtime使用

    简单的循环动画

    编辑上看视频教程吧, 只是打包文件需要使用TexturePacker的libgdx的Data Format来导出, 后缀改为atlas.
    然后, 从例子中能学到的东西:

    1. new CCSkeletonAnimation("test.json", "test.atlas");来创建想要的Spine动画对象.
    2. CCSkeletonAnimationsetAnimation("anim_name", true);来设定想要的动画.
    3. 需要将CCSkeletonAnimation对象按node一样处理, 用addChild接口添加到parent node上. 并且对象可以当作普通的Node一样来操作, 因为它实际就继承自CCNodeRGBA.

    比如在一个node中, 按如下代码可以创建一个spineboy行走的动画, 并且循环播放.

    skeletonNode = new CCSkeletonAnimation("spineboy.json", "spineboy.atlas");
    skeletonNode->setAnimation("walk", true);
    
    CCSize windowSize = CCDirector::sharedDirector()->getWinSize();
    skeletonNode->setPosition(ccp(windowSize.width / 2, 20));
    addChild(skeletonNode);
    skeletonNode->release();
    

    播放一次动画

    简单的情况, 播放一次动画后就不管了, 那么直接使用CCSkeletonAnimation::setAnimation, 并且以false为第二个参数就好了.
    更复杂的情况, 需要知道什么时候这个动画播放完了, 因为Spine的Runtime中没有动画结束的回调(这是另外一种良好的设计), 只能通过在update中判断. 更进一步的悲剧是, 在cocos2d-x的Runtime中中没有简单的判断方法, example中给了一个方法:

    if (skeletonNode->states[0]->loop) {
      if (skeletonNode->states[0]->time > 2) skeletonNode->setAnimation("jump", false);
    } else {
      if (skeletonNode->states[0]->time > 1) skeletonNode->setAnimation("walk", true);
    }
    

    这里使用的方法是判断播放时间, 我对此方法表示强烈的反感, 也绝对的建议大家不要使用, 因为你不仅需要预先知道每个动画播放的时长, 而且任何时候你改动了动画的播放时间, 这个代码都得回来改, 这样做根本就违反我们使用编辑器的初衷, 甚至我觉得在Runtime的example中给出这种代码是非常不负责任的行为. 这个方法只在一种情况下使用, 那就是你的确是想要在某个动画播放的确定时间干某个事情, 不过这种情况应该非常少见.
    在的确需要知道播放完一次动画时, 我建议用以下方式来完成, 因为没有现成的C++接口, 这里借用了一个C代码中的函数来完成工作:

    if(AnimationState_isComplete(skeletonNode->states[0])) {
      if ( 0 == strcmp(skeletonNode->states[0]->animation->name, "walk") ) {
        skeletonNode->setAnimation("jump", false);
      }
      else {
        skeletonNode->setAnimation("walk", false);
      }
    }
    

    连续播放动画

    上面那个例子中的动画连续动画播放可以直接通过CCSkeletonAnimation::addAnimation接口来完成, 这样更加简单.

    skeletonNode = new CCSkeletonAnimation("spineboy.json", "spineboy.atlas");
    
    skeletonNode->addAnimation("walk", false);
    skeletonNode->addAnimation("jump", false);
    skeletonNode->addAnimation("walk", true);
    

    但是失去了一些灵活性, 并且, Spine还不支持将多个动画接起来作为一个完整的动画使用, 这个挺弱的, 再加上Spine工具本身就没有连接多个动画的功能, 就更加弱了.

    程序控制的骨骼动画

    所谓程序控制的骨骼动画, 就是类似Spine宣传动画中那样, Globin的目光跟随着鼠标的移动. 这个功能的实现, 应该算是骨骼动画中最酷的一部分了. 传统的序列帧动画完全无法实现, 要实现的话还是得在序列帧外拆分肢体, 然后单独实现.
    在骨骼动画中, 可以直接取到骨骼, 然后调整骨骼, 实现这样的效果, 要方便很多. 在Spine中取得骨骼的函数是CCSkeletonAnimation::findBone, 其他的就是设置rotation就行了.

    void ExampleLayer::ccTouchesMoved(CCSet *touches, CCEvent *event) {
      CCTouch* touch = (CCTouch*)touches->anyObject();
      CCPoint pos = touch->getLocation();
      Bone* head = skeletonNode->findBone("head");
      CC_ASSERT(head != nullptr);
      float tanValue = (pos.y - head->worldY) / (pos.x - head->worldX);
      float rotation = atan(tanValue) * 180 / 3.1415;
      head->rotation = rotation;
    }
    

    需要注意的是, 动画本身要是在播放的话, 不能动这个骨骼(被parent牵引是OK的), 不然的话会被动画本身强制改变, 看不到touch带来的效果.

    其他功能

    慢动作和快动作

    设置CCSkeletonAnimation的timeScale值.

    动画混合

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

    skeletonNode->setMix("walk", "jump", 0.3f);
    skeletonNode->setMix("jump", "walk", 0.3f);
    

    问题

    Spine的出现, 对于2D骨骼动画编辑工具来说, 绝对是翻天覆地的变化, 划时代的. 这也再次说明了自己的问题, 因为和以前的同事说了很久了, 其实我们需要一个这样的编辑器, 但是自己却从来没有写过一个-_-! 当然, 我们当时讨论的是做一个开源的. 但是, Spine毕竟刚刚出现, 其实还是有不少的问题. 如下:

    工具使用上

    1. 体验上, 因为Spine用了JAVA来实现偷懒的跨平台, 很多地方都弱爆了, 奇怪的menu就不说了, 那文件对话框难用的要死, 在Mac下, 会觉得那文件对话框简直就是折磨人, 不管是选对一个文件夹, 还是保存文件到一个地方, 都能让人很郁闷. 还能出现原界面被阻塞, 而文件对话框被挡住的情况. 假如要一套代码的跨平台通用, 那就没有用户体验可言. 当然, 其实Spine本身对动画编辑方面的体验还是非常棒的.
    2. 功能上, Spine不支持像cocos builder一样直接读取pack后的材质, 只能读原始的材质, 这个有些弱, 导致需要在原始资源上进行编辑. 这个在工程管理上没有直接读取打包后的材质方便. 假如打包出了什么问题, 这里也看不见.
    3. 还是功能上, Spine在编辑器中无法直接连接多个动画, 这个功能连cocos builder中都有.
    4. 虽然Spine有个用example做UI的演示, 但是实际上因为Spine没有任何地方可以设置点击响应和设置变量绑定, 这个基本上也就是只能做做UI上面的动画.
    5. 这个和Runtime也有关, Spine的扩展性几乎没有, 连想自定义一个参数都没有办法, 比如我想用Spine来设置一个Bone的旋转的上限和下限, 也无法做到.

    Runtime的问题

    Spine的Runtime有些太马虎了, 问题相当多.

    1. 没有详细的文档就算了, 甚至连代码的注释生成文档都没有. 同时代码的注释也少的可怜, 根本就不像一个严谨的开源项目. 更进一步, 连example都只有1个, 要是不知道该怎么用, 哭去吧. 这个只能说Spine还不够成熟, 一般来说, 像这种程度的东西, 最好别用.
    2. 为了让一套代码能够尽量支持多的引擎, 有些地方太偷懒了. 对此吐槽的也不止我一个, 比如这里的A call for coders to build a better Spine runtime for Cocos2D, 就算是C++使用者, 用这简单从C wrap过来的runtime我都感觉非常难受, 更加别说objc的使用者了.
    3. 最大的问题是Spine用了一套后缀为atlas的资源文件, 但是这根本不是cocos2d/cocos2d-x的使用方式, 我们要的是plist! 所以Spine用到的资源会和Cocos2d-x中用到的资源格格不入, 无法统一管理和cache. 这种问题使得Spine几乎不可用, 因为一个稍微想点样子的游戏, 也不能容忍每个动画都是在需要播放的时候再加载资源.
      这个问题有个解决方案, 就是不用example中使用的CCSkeletonAnimation创建接口CCSkeletonAnimation::CCSkeletonAnimation (const char* skeletonDataFile, const char* atlasFile, float scale), 而是使用CCSkeletonAnimation::CCSkeletonAnimation (const char* skeletonDataFile, Atlas* atlas, float scale)这个接口, 并且自己首先缓存Atlas文件. 或者, 直接缓存所有可能出现的skeletonNode对象. 只是, 这些解决方法都太麻烦并且不够优美. 并且, 还是没有办法和cocos2d-x原有的资源统一管理.
    展开全文
  • 在CocosCreator中运行效果如下图所示:准备流程:spine中信息列表:导出文件:拖入对应骨骼,然后添加脚本:脚本如下:cc.Class({ extends: cc.Component, editor: { requireComponent: sp.Skeleton }, properties: {...

    在CocosCreator中运行效果如下图所示:

    准备流程:

    spine中信息列表:


    导出文件:


    拖入对应骨骼,然后添加脚本:


    脚本如下:

    cc.Class({
        extends: cc.Component,
        editor: {
            requireComponent: sp.Skeleton
        },
    
        properties: {
            mixTime: 0.2
        },
    
        onLoad() {
            var spine = this.spine = this.getComponent('sp.Skeleton');
            this._setMix('walk', 'run');
            this._setMix('run', 'jump');
            this._setMix('walk', 'jump');
    
            // .setStartListener()用来设置开始播放动画的事件监听。
            spine.setStartListener(trackEntry => {
                var animationName = trackEntry.animation ? trackEntry.animation.name : "";
                cc.log("[track %s][animation %s] start.", trackEntry.trackIndex, animationName);
            });
            // .setInterruptListener()用来设置动画被打断的事件监听。
            spine.setInterruptListener(trackEntry => {
                var animationName = trackEntry.animation ? trackEntry.animation.name : "";
                cc.log("[track %s][animation %s] interrupt.", trackEntry.trackIndex, animationName);
            });
            // .setEndListener()用来设置动画播放完后的事件监听。
            spine.setEndListener(trackEntry => {
                var animationName = trackEntry.animation ? trackEntry.animation.name : "";
                cc.log("[track %s][animation %s] end.", trackEntry.trackIndex, animationName);
            });
            // .setDisposeListener()用来设置动画将被销毁的事件监听。
            spine.setDisposeListener(trackEntry => {
                var animationName = trackEntry.animation ? trackEntry.animation.name : "";
                cc.log("[track %s][animation %s] will be disposed.", trackEntry.trackIndex, animationName);
            });
            // .setCompleteListener用来设置动画播放一次循环结束后的事件监听。
            spine.setCompleteListener((trackEntry, loopCount) => {
                var animationName = trackEntry.animation ? trackEntry.animation.name : "";
                if (animationName === 'attack') { //如果当前为射击状态,立马清除
                    // .clearTrack(对应状态数字)清除出指定 track 的动画状态。
                    this.spine.clearTrack(1);
                }
                cc.log("[track %s][animation %s] complete: %s", trackEntry.trackIndex, animationName, loopCount);
            });
            // .setEventListener()用来设置动画播放过程中帧事件的监听。
            spine.setEventListener((trackEntry, event) => {
                var animationName = trackEntry.animation ? trackEntry.animation.name : "";
                cc.log("[track %s][animation %s] event: %s, %s, %s, %s", trackEntry.trackIndex, animationName, event.data.name, event.intValue, event.floatValue, event.stringValue);
            });
    
            this._hasStop = false;
    
            // var self = this;
            // cc.eventManager.addListener({
            //     event: cc.EventListener.TOUCH_ALL_AT_ONCE,
            //     onTouchesBegan () {
            //         self.toggleTimeScale();
            //     }
            // }, this.node);
        },
    
        // OPTIONS
    
        toggleDebugSlots() {
            // .debugSlots是否显示 slot 的 debug 信息。
            this.spine.debugSlots = !this.spine.debugSlots;
        },
    
        toggleDebugBones() {
            // .debugBones是否显示 bone 的 debug 信息。
            this.spine.debugBones = !this.spine.debugBones;
        },
    
        toggleTimeScale() {
            // .timeScale当前骨骼中所有动画的时间缩放率。
            if (this.spine.timeScale === 1.0) {
                this.spine.timeScale = 0.3;
            } else {
                this.spine.timeScale = 1.0;
            }
        },
    
        // ANIMATIONS
    
        stop() {
            // .clearTrack(对应状态数字)清除出指定 track 的动画状态。
            this.spine.clearTrack(0);
            this._hasStop = true;
        },
    
        walk() {
            // .setAnimation(trackIndex,name,loop)设置当前动画。队列中的任何的动画将被清除。返回一个 sp.spine.TrackEntry 对象。
            this.spine.setAnimation(0, 'walk', true);
            this._hasStop = false;
        },
    
        run() {
            // .setAnimation(trackIndex,name,loop)设置当前动画。队列中的任何的动画将被清除。返回一个 sp.spine.TrackEntry 对象。
            this.spine.setAnimation(0, 'run', true);
            this._hasStop = false;
        },
    
        jump() {
            // .animation当前播放的动画名称。
            var oldAnim = this.spine.animation;
            // .setAnimation(trackIndex,name,loop)设置当前动画。队列中的任何的动画将被清除。返回一个 sp.spine.TrackEntry 对象。
            this.spine.setAnimation(0, 'jump', false);
            if (oldAnim && !this._hasStop) {
                this.spine.addAnimation(0, oldAnim === 'run' ? 'run' : 'walk', true, 0);
            }
        },
    
        crouch() {
            // .setAnimation(trackIndex,name,loop)设置当前动画。队列中的任何的动画将被清除。返回一个 sp.spine.TrackEntry 对象。
            this.spine.setAnimation(0, 'crouch', true);
            this._hasStop = false;
        },
    
        head_turn() {
            // .setAnimation(trackIndex,name,loop)设置当前动画。队列中的任何的动画将被清除。返回一个 sp.spine.TrackEntry 对象。
            this.spine.setAnimation(0, 'head-turn', true);
            this._hasStop = false;
        },
    
        fall() {
            // .setAnimation(trackIndex,name,loop)设置当前动画。队列中的任何的动画将被清除。返回一个 sp.spine.TrackEntry 对象。
            this.spine.setAnimation(0, 'fall', true);
            this._hasStop = false;
        },
    
        idle() {
            // .setAnimation(trackIndex,name,loop)设置当前动画。队列中的任何的动画将被清除。返回一个 sp.spine.TrackEntry 对象。
            this.spine.setAnimation(0, 'idle', true);
            this._hasStop = false;
        },
    
        // crouch() {
        //     // .animation当前播放的动画名称。
        //     var oldAnim = this.spine.animation;
        //     // .setAnimation(trackIndex,name,loop)设置当前动画。队列中的任何的动画将被清除。返回一个 sp.spine.TrackEntry 对象。
        //     this.spine.setAnimation(0, 'crouch', false);
        //     if (oldAnim && !this._hasStop) {
        //         this.spine.addAnimation(0, oldAnim === 'run' ? 'run' : 'walk', true, 0);
        //     }
        // },
    
        attack() {
            // .setAnimation(trackIndex,name,loop)设置当前动画。队列中的任何的动画将被清除。返回一个 sp.spine.TrackEntry 对象。
            this.spine.setAnimation(1, 'attack', false);
        },
    
        _setMix(anim1, anim2) {
            // .setMix()为所有关键帧设定混合及混合时间(从当前值开始差值)。
            this.spine.setMix(anim1, anim2, this.mixTime);
            this.spine.setMix(anim2, anim1, this.mixTime);
        }
    });

    展开全文
  • 更新cocos2dx中的spine

    2019-10-25 14:23:24
    window平台,cocos2dx 3.13.1版本,更新spine库到cocos2dx 3.17.2版本。GitHub上的spine库嵌入的到cocos2dx的方法稍微有点不同 spine库GitHub地址。只是为了测试,所以Android,IOS的没更新同步。 二、更新过程 ...
  • Cocos教程:Spine组件参考 CocosAPI:Skeleton CSDN:Spine动画局部换装(切换武器) 简书:Spine使用图片换装 - Unity cocos论坛:spine是否可以用外部图片进行换皮 一cocos2.3版本只支持spine3.8导出的二进制 ...
  • spine3.0导出文件转换成cocos3.8可使用文件工具 是cocos3.8可以读取spine3.0导出的文件
  • 1.动态加载spine动画 挂载spine动画依赖sp.Skeleton组件 设置spine动画三个重要的属性,也可以代码动态设置 Skeleton Data 骨骼信息数据,拖拽Spine 导出后的骨骼资源到该属性中 Default Skin 选择默认的...
  • 前情提要: 公司当时用spine3.7版本和cocos3.1版本。 手欠更新spine版本到3.8后, 做出的东西, cocos读不出。 ! 解决方法: ...从设置里找到版本号,选择版本。...即便是spine3.8导出的json文件,也导入...
  • 导入spine使用

    2016-07-07 11:02:32
    2、导入spine动画,,里面有贴图,json文件,atlas文件(此文件必须加.txt后缀,否则unity认不到) 3、由于有了第一步,里面脚步对编辑器扩展,所以我们右键create多了一些选项,在2的目录下create -》spine Atlas....
  • 首先感谢我的师傅CQ,在cocos2dx游戏开发的路上给了我多次
  • cc.Class({ extends: cc.Component, editor: { requireComponent: sp.Skeleton }, properties: { label:{ default: null, type: cc.Label } }, // LIFE-CYCLE CALLBACKS: ......
  • [Cocos Creator] 本地文件加载系列一:本地文件读取(web模式) [Cocos Creator] 本地文件加载系列二:本地音频文件播放(web模式) [Cocos Creator] 本地文件加载系列三:本地粒子文件加载和播放(web模式) ...
  • [A-A+ lareina 2014 ... 年 7 月 25 日 暂无评论 2485 次浏览Cocos2d-x | 新手入门新手入门 文章目录 骨骼动画编辑器——SpineSpine动画的使用 任珊原创,首发于泰然,转载请注明出处 ...
  • 源代码请到Github下载 ...cocos2dx 3.9 spine 2.1.27 使用步骤将其拷贝到 spine 目录下import them to spine.h#include <spine/SkeletonBinary.h>修改SkeletonRenderer.cppstd::string
  • 1:准备好unity使用Spine所需要的运行库,可到如下地址 https://github.com/EsotericSoftware/spine-runtimes/tree/master/spine-unity  使用git下载,或直接下载master.zip文件,资源下载看下面的优化部分。 2:...
  •  本片blog主要给大家提供一个统一的骨骼动画解决方案,无论你之前用的是cocos自带的骨骼,还是spine,或者是两者都有,都可以转换成dragonbones骨骼,然后加到游戏中使用。  如果你的事2.3及以后的版本的骨骼文件...
  • 四:所有的图形必须是位图,暂时不提供包含矢量图的fla文件导入,在保存项目之前您需要将所有的矢量图转换为位图。 五:每一个骨骼对应一个“元件”,创建元件时候可以选择影片剪辑和图像两个类型 六:每一个元件...
  • Spine是一个很好的制作2D骨骼动画的软件,其中提供的混合(mix)动画功能可以很柔和过度两个不同的动画,但在混合时期,稍有不善,非常容易出现各种错乱。在Spine2D骨骼动画群上,有人提出全K帧、K透明轴等等方法,...
  • //骨骼动画Spine,需要包含Spine/spine-cocos2dx.h头文件,命名空间spine auto skeleton=SkeletonAnimation::createWithFile("spine/spineboy.json", "spine/spineboy.atlas");//加载文件 skeleton->setAnimation...
1 2 3 4 5 ... 18
收藏数 349
精华内容 139
热门标签
关键字:

spine导入cocos