Cocos2d-JS下往Sprite SkeletonAnimation Armature(骨骼动画)添加shader

cocos2dx-lua 骨骼动画spine使用心得(cocos2dx版本 3.17 spine版本3.6.53) 主要记录了本人在lua代码中使用spine骨骼动画的一些心得,包括以下内容: 1.骨骼动画简述 2.骨骼动画工具 3.应用于代码中 4.其他动画设置的小操作 阅读详情

环境:

win7 64位

Cocos2d-JS v3.0 (final)

Cocos Code IDE v1.0.0.RC2

在win32和安卓真机上测试已成功,在浏览器上浏览器会报shader文件初始化错误,不知道是不是引擎的BUG...


除了shader用到的两个文件,其他动画资源都可以在官方demo资源文件夹中找到,文章的最后也会附上用到的文件(包括shader文件)


另外,文章步骤讲得比较细,大家会的就看得快一点就好了,忍不住要喷的话喷得轻点,,,照顾下新人= =


正文:

1.在Cocos Code IDE下新建一个HelloWold工程:

1.1File->New->Cocos JavaScript Project



1.2把Project Name改为你自己喜欢的名字= =(那个Create Project in workspace下的路径自己设置就好了)

点Next>

1.3 下面的Add Native Codes是打包成安卓或者IOS文件才要的,不勾也行,打包编译的时候也会有相应添加操作

点Finish


2.把资源添加到工程的res目录下

2.1把这些文件复制(文章最后有这些资源下载的链接...)



2.2右击res,粘贴(到res目录下)



3.资源预加载

3.1双击该文件


3.2在里面添加框选的部分(这里个是我用来测试的工程,所以还有其他资源文件,大家不要在意这些细节...)


最后的一行记得别带 , (逗号)即图片里TestBone_png : "res/TestBone0.png"后面是没有逗号的

附上代码:

var res = {
    HelloWorld_png : "res/HelloWorld.png",
    CloseNormal_png : "res/CloseNormal.png",
    CloseSelected_png : "res/CloseSelected.png",
    Gray_fsh : "res/gray.fsh",
    Grat_vsh : "res/gray.vsh",
    SpineBoy_atalas : "res/spineboy.atlas",
    SpineBoy_json : "res/spineboy.json",
    SpineBoy_png : "res/spineboy.png",
    CowBoy_exportjson : "res/Cowboy.ExportJson",
    CowBoy_plist0 : "res/Cowboy0.plist",
    COwboy_png0 : "res/Cowboy0.png"
};


4.官方说调用CocosStudio制作的东西要在project.json文件的model里添加"extensions", "external"

4.1双击打开project.json


4.2添加"extensions", "external"


实测,不添加也可以正常运行


5.在工程的src文件夹下app.js里面最后添加如下代码(文章最后会提供整个app.js里面的代码)

function graySprite(sprite) {
    if (sprite) {
        var shader = new cc.GLProgram();//创建一个cc.GLProgram对象
        shader.init(res.Grat_vsh, res.Gray_fsh);//初始化顶点着色器和片元着色器
        shader.link();//连接
        shader.updateUniforms();//我的理解是经过一系列的矩阵变换渲染到屏幕上
        sprite.setShaderProgram(shader);//应用到精灵上
    }
}

具体的API可以自行到官网API文档查询http://www.cocos2d-x.org/reference/html5-js/V3.0/index.html

如查看cc.GLProgram



6.应用到HelloWorld图片中

如图红色框位置处添加

 graySprite(this.sprite);


保存,查看效果(按F11):


但是,如果你看到的效果是如下所示:


请把gray.vsh文件gl_Position改为:

    gl_Position = CC_PMatrix * a_position;



注:gray.vsh文件可以这样打开:右键该文件,然后如图所示操作



7.添加SkeletonAnimation动画 

接着在app.js里面添加如下代码

var spineBoy = new sp.SkeletonAnimation(res.SpineBoy_json, res.SpineBoy_atalas);
        spineBoy.setPosition(cc.p(size.width / 2, size.height / 2 - 150));
        spineBoy.setAnimation(0, 'walk', true);//trues时为一直循环播放
        spineBoy.setMix('walk', 'jump', 0.2);//从walk转换到run动画的过度时间
        spineBoy.setMix('jump', 'walk', 0.4);
        graySprite(spineBoy);//变成灰色
        this.addChild(spineBoy, 2);

动画的名字可以在res文件夹下,与打开gray.vsh文件的方式一样,打开spineboy.json文件

往下拉到98行,可以看到动画名称:



这种动画里的gray.vsh文件gl_Position为

    gl_Position = (CC_PMatrix * CC_MVMatrix) * a_position;
不然位置等会变的

保存,运行:


8.添加Armature动画

创建动画和调用每个骨骼节点渲染函数(渲染每一个骨骼节点为灰色,这种类型创建的骨骼动画要把每个骨骼节点出来分别渲染)

       ccs.armatureDataManager.addArmatureFileInfo(res.COwboy_png0, res.CowBoy_plist0, res.CowBoy_exportjson);//动画文件信息放到动画数据管理器里面
        var armature = ccs.Armature.create("Cowboy");//从动画数据管理器里面创建名叫Cowboy的动画对象
        armature.getAnimation().play("Walk");//播放Cowboy里面名叫Walk的动画
        armature.x = size.width * 0.1;
        armature.y = size.height / 2;
        armature.setScale(0.5);
        this.grayArmature(armature);//渲染每一个骨骼节点为灰色,这种类型创建的骨骼动画要把每个骨骼节点出来分别渲染
        this.addChild(armature, 4, 0);

动画对象的名字(就是那个Cowboy)和动画对应的名字(Walk)从Cowboy.ExportJson里面可以查看得到,和上面的查看方式一样


注意这里一定要用.create的方式创建,不能用new方式,不然控制台会报这样的错误:TypeError: armature.getAnimation(...) is null,起码这个版本是这样的,不知道3.1beta版本修复这个BUG没有


每个骨骼节点渲染函数

grayArmature: function (armature) {
        var locBoneDic = armature.getBoneDic();
        for (var key in locBoneDic) {
            var bone = locBoneDic[key];

            if (bone && bone.getDisplayRenderNode()) {//存在且为显示的节点才进行渲染
                var node = bone.getDisplayRenderNode();
                graySprite(node);
            }
        }
    }


注意这里的 gray.vsh文件gl_Position为:

    gl_Position = CC_PMatrix * a_position;

好了,最后看看效果:




9.代码及资源

9.1整个app.js代码:

var HelloWorldLayer = cc.Layer.extend({
    sprite: null,
    ctor: function () {
        // ////////////////////////////
        // 1. super init first
        this._super();

        // ///////////////////////////
        // 2. add a menu item with "X" image, which is clicked to quit the
        // program
        // you may modify it.
        // ask the window size
        var size = cc.winSize;

        // add a "close" icon to exit the progress. it's an autorelease object
        var closeItem = new cc.MenuItemImage(
            res.CloseNormal_png,
            res.CloseSelected_png,
            function () {
                cc.log("Menu is clicked!");
            }, this);
        closeItem.attr({
            x: size.width - 20,
            y: 20,
            anchorX: 0.5,
            anchorY: 0.5
        });

        var menu = new cc.Menu(closeItem);
        menu.x = 0;
        menu.y = 0;
        this.addChild(menu, 1);

        // ///////////////////////////
        // 3. add your codes below...
        // add a label shows "Hello World"
        // create and initialize a label
        //var helloLabel = new cc.LabelTTF("Hello World"+SimpleNativeClass.getAnotherMoreComplexField(), "Arial", 38);
        var helloLabel = new cc.LabelTTF("Hello World", "Arial", 38);
        // position the label on the center of the screen
        helloLabel.x = size.width / 2;
        helloLabel.y = 0;
        // add the label as a child to this layer
        this.addChild(helloLabel, 5);

        // add "HelloWorld" splash screen"
        this.sprite = new cc.Sprite(res.HelloWorld_png);
        this.sprite.attr({
            x: size.width / 2,
            y: size.height / 2,
            scale: 0.5,
            rotation: 180
        });
        this.addChild(this.sprite, 0);
        graySprite(this.sprite);
        this.sprite.runAction(
            cc.sequence(
                cc.rotateTo(2, 0),
                cc.scaleTo(2, 1, 1)
            )
        );
        helloLabel.runAction(
            cc.spawn(
                cc.moveBy(2.5, cc.p(0, size.height - 40)),
                cc.tintTo(2.5, 255, 125, 0)
            )
        );

        var spineBoy = new sp.SkeletonAnimation(res.SpineBoy_json, res.SpineBoy_atalas);
        spineBoy.setPosition(cc.p(size.width / 2, size.height / 2 - 150));
        spineBoy.setAnimation(0, 'walk', true);
        spineBoy.setMix('walk', 'jump', 0.2);
        spineBoy.setMix('jump', 'walk', 0.4);
        graySprite(spineBoy);
        this.addChild(spineBoy, 2);

        return true;
    },

    onEnter: function () {
        this._super();
        var size = cc.winSize;
        ccs.armatureDataManager.addArmatureFileInfo(res.COwboy_png0, res.CowBoy_plist0, res.CowBoy_exportjson);
        var armature = ccs.Armature.create("Cowboy");
        armature.getAnimation().play("Walk");
        armature.x = size.width * 0.1;
        armature.y = size.height / 2;
        armature.setScale(0.5);
        this.grayArmature(armature);
        this.addChild(armature, 4, 0);
    },
    grayArmature: function (armature) {
        var locBoneDic = armature.getBoneDic();
        for (var key in locBoneDic) {
            var bone = locBoneDic[key];

            if (bone && bone.getDisplayRenderNode()) {
                var node = bone.getDisplayRenderNode();
                graySprite(node);
            }
        }
    }
});

function graySprite(sprite) {
    if (sprite) {
        var shader = new cc.GLProgram();
        shader.init(res.Grat_vsh, res.Gray_fsh);
        shader.link();
        shader.updateUniforms();
        sprite.setShaderProgram(shader);
    }
}

var HelloWorldScene = cc.Scene.extend({
    onEnter: function () {
        this._super();
        var layer = new HelloWorldLayer();
        this.addChild(layer);
    }
});


9.2片元着色器代码:

//uniform sampler2D CC_Texture0;
varying vec2  v_texCoord;
void main()
{
    vec4 v_orColor = texture2D(CC_Texture0, v_texCoord);
    float gray = dot(v_orColor.rgb, vec3(0.299, 0.587, 0.114));
    gl_FragColor = vec4(gray, gray, gray, v_orColor.a);
}
注意这里uniform sampler2D CC_Texture0;这里要是不注释掉,程序会崩溃的

9.3顶点着色器代码:

attribute vec2     a_texCoord;
attribute vec4     a_position;
varying vec2    v_texCoord;
void main()
{
    v_texCoord  = a_texCoord;
    //gl_Position = (CC_PMatrix * CC_MVMatrix) * a_position;
    gl_Position = CC_PMatrix * a_position;
}


9.4所用到的资源文件(包括shader文件):shader等资源




深度剖析Cocos Creator中的Shader编程:从入门到精通,打造绚丽视觉效果! 通过本文的详细讲解,相信你已经对Cocos Creator中的Shader编程有了初步的认识和了解。Shader编程是一门既有趣又充满挑战的技术,它能够让你的游戏和应用在视觉上脱颖而出。希望你在未来的开发过程中,能够灵活运用Shader编程,创造出更多令人惊叹的视觉效果! 阅读详情

相关推荐

Cocos2d-JS Shader资源文件:灰度效果与渲染增强

GLSL(OpenGL Shading Language)是一种用于编写可编程图形管线阶段的着色器的高级语言,它允许开发者自定义顶点和片段处理过程。GLSL的语法与C语言类似,因此对于有C语言基础的开发者来说,学习GLSL会相对容易。GLSL中的基本语法结构包括变量声明、函数定义、控制流语句和修饰符等。一个简单的GLSL程序通常包括至少一个顶点着色器和一个片段着色器,它们通过输入和输出变量相互联系。下面是一个基本的GLSL顶点着色器示例:// 顶点着色器// 顶点位置输入变量。

weixin_42527589的博客 1098

[OpenGL] 骨骼动画原理和实现(Qt)

[OpenGL] 骨骼动画原理和实现(Qt)

whl0071的专栏 1440

火龙游走:Spine骨骼动画深度解析与实践

Spine是由Esoteric Software公司开发的一款2D骨骼动画软件,它允许用户通过绑定骨骼到角色上,以制作高度灵活的动画。这种技术相较于传统的帧动画,在资源利用、动画复杂性以及动态交互方面具备显著优势,使得开发者能够创建更加流畅和生动的角色动画。动画事件是Spine动画中重要的交互节点。事件可以在特定帧触发,被用来调用游戏逻辑代码,例如角色跳跃、攻击或者触发其他游戏中的逻辑。在Spine编辑器中,创建一个事件,并在动画的时间轴上将事件添加到指定的位置。

weixin_29859471的博客 1109

Cocos骨骼动画

生成骨骼动画的软件:Spine或者cocosStudio 我们就是用做好的资源来做骨骼动画的(骨骼动画由几个描述文件和一张资源图片组成) 首先,必须加入头文件:#include "spine/spine-cocos2dx.h" 然后,可以使用(创建骨骼对象): spine::SkeletonAnimation* ske = spine::SkeletonAnimation::creat

Samgenius的博客 1695

使用shader的骨骼动画

这是Frank Luna进行骨骼蒙皮动画教学的代码,里边使用了HLSL,通过效果文件实现骨骼动画,并且在程序运行时显示帧数。 对学习3D的同学会有所帮助。

cocos2dx骨骼动画Armature源码剖析(一)

cocos2dx中的骨骼动画在程序中使用非常方便,从编辑器(cocostudio或flash插件dragonBones)得到xml或json数据,调用代码就可以直接展示出动画效果,下面通过本篇文章给大家分享cocos2dx骨骼动画Armature源码剖析,需要的朋友一起来学习吧。

cocos js Spine sp.SkeletonAnimation

在网页上调用需要加载资源完成后在调用 现在有个问题 在网页上显示不出来 也没有抛出异常 在 simulator下是能显示出来的 cc.loader.load(["res/g/lzmr/ani/swat/quanleida.json", "res/g/lzmr/ani/swat/quanleida.atlas"],

笙尽缘无 4704

TMP112/TMP102温度传感器驱动开发与嵌入式实战

数字温度传感器是嵌入式系统环境感知的核心器件,其通过I²C等标准总线实现高精度、低功耗测温。原理上依赖ΔΣ模数转换与二进制补码数据格式,结合寄存器配置实现模式控制、阈值报警与功耗管理。技术价值体现在±0.5°C级精度、1μA级静态电流及SOT-563超小封装带来的系统集成优势。广泛应用于工业MCU热监控、电池物联网终端、医疗电子温度补偿及汽车ECU板级测温等场景。本文围绕TMP112/TMP102展开,深入解析寄存器协议、硬件接口约束、HAL驱动分层设计、FreeRTOS任务调度及生产级校准方法,覆盖从芯片

weixin_35756690的博客 674

cocos2d-js 骨骼动画 3.10

近期使用了cocos动画中的骨骼动画,这里记录使用的两种方式(3.10版): 一、cocos自带的动画编辑器导出的动画 1 ccs.armatureDataManager.addArmatureFileInfo(res.mascot_1_json); 2 var wolfAnimation = new ccs.Armature("niu"); 3 wolfAnimation.se...

weixin_30721899的博客 298

LightTools宏 vs Python API:光学仿真自动化方案选型指南

本文深入对比了LightTools光学仿真自动化中VBA宏与Python API两种方案。VBA宏内嵌易用,适合固定流程批处理;Python API生态强大,尤其在参数优化算法集成方面优势显著,便于构建复杂工作流。文章结合案例,为不同场景下的技术选型提供清晰指南。

garlic的博客 939

Python 爬虫:获取网页数据的 5 种方法

requests:适用于简单的静态网页抓取,易于使用。requestslxml:适合需要高效解析大规模网页内容的情况,支持 XPath 和 CSS 选择器。Selenium:适用于动态网页(JavaScript 渲染)的抓取,模拟浏览器行为获取动态数据。Scrapy:强大的爬虫框架,适合大规模的网页抓取任务,支持异步请求和高级功能。PyQuery:基于 jQuery 语法,适合快速开发,提供简洁的 CSS 选择器语法。

想看什么文章都可以私信给我,综合性博客。 5511

COCOS 骨骼动画

--加载骨骼动画     local atlas = "res/animations/EveryReward/BuYu_XYCJ.atlas"     local json =  "res/animations/EveryReward/BuYu_XYCJ.json"     self.     local json =  "res/animations/EveryReward/BuYu_

qq_36719480的博客 454

多目标跟踪(MOT)中的卡尔曼滤波(Kalman filter)和匈牙利(Hungarian)算法详解

多目标跟踪(MOT)中的卡尔曼滤波(Kalman filter)和匈牙利(Hungarian)算法详解 1. 概览 在开始具体讨论卡尔曼滤波和匈牙利算法之前,首先我们来看一下基于检测的目标跟踪算法的大致流程。 2. 卡尔曼滤波(Kalman filter) 目标跟踪中使用的就是最基础的 Kalman filter 算法。这里也仅仅讨论最基础的 Kalman filter 算法。 卡尔曼滤波算法的过程很简单,如下图所示。最核心的两个步骤就是预测和更新(下图的 correct)。 在目标跟踪任务中,目标的

生命在于折腾! 2万+

Cocos2d-JS 使用定时器取消往图片、骨骼动画添加的shader

环境: win7 64位 Cocos2d-JS v3.0 (final) Cocos Code IDE v1.0.0.RC2

et_sandy的专栏 2259

编译CycloneDDS和CycloneDDS-CXX踩过的坑——CMake Error at CMakeLists.txt:227 (find_package):

最近编译CycloneDDS和CycloneDDS-CXX踩了两个坑,花了不少时间。做个简单的记录,免得以后又踩到。注意:CycloneDDS-CXX编译依赖CycloneDDS,因此必须先编译CycloneDDS需要严格按照步骤进行,否则要入坑步骤如下,1先编译CycloneDDS以上步骤完成CycloneDDS的编译和安装,生成的bin include lib等位于install目录下面。

usstmiracle的博客 1900

语音增强评价指标全解析:从MOS到eSTOI的实战指南

本文全面解析了语音增强领域的核心评价指标,包括主观评价的黄金标准MOS,以及PESQ、STOI、eSTOI等关键客观指标。文章详细阐述了各指标的原理、适用场景与实战计算方法,并提供了Python代码示例,旨在帮助开发者和研究者建立科学的评估体系,以平衡语音可懂度与音质,从而优化算法效果。

yhn456789的博客 1198

cocosLua 之 骨骼动画

cocos2d lua 骨骼动画的使用

鹤九日的博客 1105

5、快速入门

点击启动实例按钮,并设计一个business key,每个实例会有一个business key, 业务主键,也相当于一个流程实例唯一key,一般会与一次业务强相关,比如一个订单号 ,此处取为shopping_1;付款程序完成后会流转到物流发货任务,此时java工程的相应订阅会收到任务,并进入断点,且读到到toWhere变量。单击shopping可以进入实时流程图的执行图,此时流程流转到第一个任务,需要业务系统完成此任务,并通知引擎。添加类,分别订阅流程中的加入购物车任务和物流发货任务。

leyoliu的博客 3499

cocos creator 中使用自定义shader

为了减少游戏资源,游戏中免不了会使用一些shader,下面是一个将图片变灰shader,以此来看看如何在cocos creator中使用和管理shader。 shader文件管理 在assets中新建一个文件夹resources,然后在resources中新建一个Shader文件夹。将所shader文件放在Shader文件夹中。 现在在Shader文件夹中新建两个文件gray.vert.js...

一入編程深似海! 4052

软件崩溃时Visual Studio中看不到有效的调用堆栈,使用Windbg动态调试去分析定位

当在Visual Studio中遇到软件崩溃且无法查看详细调用堆栈时,可以使用Windbg进行动态调试去分析定位问题。

dvlinker的技术专栏 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Babylongjs-角色动画

人物动画 有时,将模型添加到场景的最简单方法是从其他地方获取模型。这可能是您在最喜欢的模型构建软件中创建的,也可能是您购买的。 该模型是一个已建成了自己的骨骼动画。 导入后,角色及其骨架将从结果对象的网格和骨架属性中获得。 BABYLON.SceneLoader.ImportMeshAsync("mesh name", "path to model", "model file", scene).then((result) => { var dude = result.mes.

BoSaidong00的博客 1426

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

cocos creator 1.x 中使用自定义shader

为了减少游戏资源,游戏中免不了会使用一些shader,下面是一个将图片变灰shader,以此来看看如何在cocos creator中使用和管理shader。 shader文件管理 在assets中新建一个文件夹resources,然后在resources中新建一个Shader文件夹。将所shader文件放在Shader文件夹中。 现在在Shader文件夹中新建两个文件gray.vert....

寒风的技术博客 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

cocos 2d - js

cocos2d - js 知识整理目录结构index.htmlmain.js代码project.json文件启动流程导演节点节点常用基本属性节点坐标场景图层Layer精灵Sprite自定义精灵组合精灵定义FarmScene .jsFarm.jsHouse.js动画精灵定义person.jsPersonScene.js标签Label菜单Menu 目录结构 main.js设置启动的场景 projec...

qq_17080419的博客 966

Cocos2d-lua中缓存骨骼动画

在cocos2d-lua中,当使用craete方法同时创建加载多个骨骼动画时,会发生卡顿。因为在每次调用craete方法时,都需要先生成一次skeletonData数据。如果可以将skeletonData数据事先加入到缓存中,然后直接用缓存的skeletonData数据去生成骨骼动画,就可以优化卡顿的问题。 先看看如何实现对skeletonData数据进行缓存。 缓存skeletonData数据 ...

MonkeyKing1992的博客 1508

OpenGL10-骨骼动画原理篇(3)-Shader版本代码已经上传

视频教程请关注http://edu.youkuaiyun.com/lecturer/lecturer_detail?lecturer_id=440 接上一个例程OpenGL10-骨骼动画原理篇(2),对骨骼动画的基本原理做了介绍,接下来 要对之前做的工作做一个分析和优化,骨骼动画要做大量的数学计算,当一个模型的顶点 与骨骼的数量都很多的情况下,会消耗大量的cpu时间,接下来要做的事情就是对程序进行 ...

weixin_30784945的博客 346

骨骼蒙皮动画(SkinnedMesh Animation)的实现

1、简介 骨骼蒙皮动画因其占用磁盘空间少并且动画效果好被广泛用于3D游戏中,它把网格顶点(皮)绑定到一个骨骼层次上面,当骨骼层次变化之后,可以根据绑定信息计算出新的网格顶点坐标,进而驱动该网格变形;一个完整的骨骼动画一般由骨架层次、绑定网格以及一系列关键帧组成,一个关键帧对应于骨架的一个新状态,两个关键帧之间的状态可以通过插值得到;下面介绍骨骼蒙皮动画在SPE中的实现细节,分为骨骼层次的表示、动

nxtgo 9347
上一篇: Cocos2d-JS win7下bindings-generator使用非r9b的NDK版本
下一篇: Cocos2d-JS 使用定时器取消往图片、骨骼动画添加的shader
ET_Sandy
博客等级 码龄15年 8粉丝 14原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值