Cocos2d-js 3.0 颜色变换(调整sprite/图片的色调)

Flash在滤镜方面做得比较成熟,starling也有很多现成的办法。

但Cocos2D这里就显得比较单薄,百度/谷歌很少相关资料。

后续如果有时间,再慢慢整理各种滤镜效果。

这里先介绍一下颜色变换的功能,这个是cocos2d内置的,用起来比较方便,只需要知道具体做了什么即可。

例如要把一个按钮变暗,也许一般做法是换一个图片,但其实也可以直接修改颜色值。

有三个方法可以做到:

            this.color = cc.color(150,150,150);

            this.setColor(cc.color(150,150,150))

            var action = cc.tintTo(1, 150,150,150);
            this.runAction(action);

另外还有tintBy的action。

这里rgb设置之后,是什么意思呢?具体做了什么运算呢?

cocos2d最大的好处就是开源,那我们通过看html5版本的代码,就可以略知一二了。

    setColor: function (color) {
        var locDisplayedColor = this._displayedColor, locRealColor = this._realColor;
        locDisplayedColor.r = locRealColor.r = color.r;
        locDisplayedColor.g = locRealColor.g = color.g;
        locDisplayedColor.b = locRealColor.b = color.b;

        var parentColor, locParent = this._parent;
        if (locParent && locParent.cascadeColor)
            parentColor = locParent.getDisplayedColor();
        else
            parentColor = cc.color.WHITE;
        this.updateDisplayedColor(parentColor);

        /*if (color.a !== undefined && !color.a_undefined) {              //setColor doesn't support changing opacity, please use setOpacity
            this.setOpacity(color.a);
        }*/
    },

    /**
     * Update the displayed color of Node
     * @function
     * @param {cc.Color} parentColor
     */
    updateDisplayedColor: function (parentColor) {
        var locDispColor = this._displayedColor, locRealColor = this._realColor;
        locDispColor.r = 0 | (locRealColor.r * parentColor.r / 255.0);
        locDispColor.g = 0 | (locRealColor.g * parentColor.g / 255.0);
        locDispColor.b = 0 | (locRealColor.b * parentColor.b / 255.0);

        if (this._cascadeColorEnabled) {
            var selChildren = this._children;
            for (var i = 0; i < selChildren.length; i++) {
                var item = selChildren[i];
                if (item)
                    item.updateDisplayedColor(locDispColor);
            }
        }
    },

从源代码中抠出这样的一段,大概可以看出,新颜色值和原颜色做了一个multiply的操作,也就是乘法。具体multiply是什么,可以查查wikipedia。

那么rgb都设置150,就等于把每个通道颜色都减淡,最终变暗。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程直播室

WebGL 动画

1684
来自专栏谦谦君子修罗刀

react-native-swiper组件-横扫你的轮播图

一念起,万水千山。一念灭,沧海桑田。 许久不曾召幸React Native爱妃,未曾想一见竟让寡人目瞪口呆。啥~~~你就说你买包包的速度能跟上你版本迭代更新的...

4816
来自专栏伪君子的梦呓

用 Python 向你比个心

之前写了一篇用 Python 画一个小猪佩奇和哆啦 A 梦,然后最近看到有人用 turtle 画了一个心,觉得挺有意思的,于是把代码复制到本地,再加了个播放音乐...

1203
来自专栏大数据钻研

HTML+CSS 面试题整理(一)

1.web标准: (1)结构标准:其语言主要包括XHTML(实现HTML向XML的过渡。)和XML(用于弥补HTML的不足) (2)表现标准:其语言主要包括C...

2978
来自专栏進无尽的文章

UI篇-自定义控件中关于父试图中的键盘遮挡问题

我们平时在设计页面的时候,考虑到MVC的设计模式会出现很多层的试图分离,这里面就不可以避免的出现自定的控件。 我在一次自定义控件中出现了以下问题,记录在案以供...

571
来自专栏前端说吧

JS案例 - 基于vue的移动端长按手势

当时首先想到要做长按事件的时候,我想到的是vue内部的自定义指令,毕竟官网里边有这么一句描述:

1592
来自专栏学习力

《Java从入门到放弃》框架入门篇:Struts2的常用基本标签

1415
来自专栏IMWeb前端团队

iconfont关于content值的坑

font-carrier是一个功能强大的字体操作库,使用它你可以随心所欲的操作字体。让你可以在svg的维度改造字体的展现形状。 //可以设置某个字对应的形状,当...

20010
来自专栏iKcamp

追溯 React Hot Loader 的实现

文:萝卜(沪江金融前端开发工程师) 本文原创,转载请注明作者及出处 如果你使用 React ,你可以在各个工程里面看到 Dan Abramov 的身影。他于...

45514
来自专栏数据小魔方

rept——一个可以一键成图的神奇函数!

今天想跟大家分享一个特别有趣的函数——rept函数。 ▼ 这个函数,就如同它的名字一样,具有重复显示字符的功能。 如图所示,在A57单元格中有一个数字1,如果我...

3545

扫码关注云+社区