![游戏开发实战宝典](https://wfqqreader-1252317822.image.myqcloud.com/cover/212/44175212/b_44175212.jpg)
3.2 颜色效果
在上一节,读者看到的都是图像的原始效果。本节将讲解如何对图像进行颜色上的变换。
3.2.1 混合模式
当两个位图重叠的时候,混合模式就起作用了。混合模式决定了重叠区域里像素变化的最终结果。下面的案例将展示混合模式的效果。
首先创建一个称为BlendMode的项目,删除src文件夹内的所有文件,然后添加一个名为Main.ts的类文件,并做出如下修改,参见二维码3-6:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/64_02.jpg?sign=1739387035-OSZEjNokS35Y5Kv1fKcL3rSB6O7tppEW-0-98cc3e2fd4374a043ec466318d0168e6)
二维码3-6
运行调试播放器观看结果,如图3-9所示:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/64_03.jpg?sign=1739387035-zQR9GwOqr4A7FX3TmHOSRbwbjQkJLU7B-0-e0e8b08f93380619246a67b7136e9281)
图3-9 观看结果
关键代码在第30行,如果将值改为egret.BlendMode.ADD,它表示将原色值添加到它的背景颜色中,结果如图3-10所示:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/65_01.jpg?sign=1739387035-4FhqPzgVAKQgK6mz8ZzHKjEJnCf42fpX-0-fdc5a9fa7cc657e8bae217e4ac932aa8)
图3-10 添加原色值
如果改为egret.BlendMode.ERASE,它表示根据显示对象的Alpha值擦除背景,即不透明区域将被完全擦除。它的效果是这样的,如图3-11所示:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/65_02.jpg?sign=1739387035-F8EVaFJobNSGTEr8KiOGfZt7tFUJGqFB-0-beb5ed8455c1c6577ae706aa55f8a446)
图3-11 擦除背景
3.2.2 滤镜
滤镜可以在运行时通过程序改变纹理的效果,比如在游戏中给图片添加发光效果、颜色叠加效果、模糊效果或投影效果等。
(1)发光滤镜
下面的案例将展示多种滤镜的效果。
首先创建一个称为Filter的项目,删除src文件夹内的所有文件,然后创建一个名为Main.ts的类文件,并对其做出如下修改,参见二维码3-7:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/66_01.jpg?sign=1739387035-nTMIL1K1wJ4cmqPE9cHK6RmucBV92dW4-0-b32a89866fc4f3cc156fb5411c918b2c)
二维码3-7
运行调试播放器观看结果,如图3-12所示:
白鹭发出红色的光晕。在代码的第36行定义了一个egret.GlowFilter对象,这个就是发光滤镜的类。该类的构造方法如下所示:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/66_02.jpg?sign=1739387035-380QYIXOnOEhhvRRJ4FRya5vEmMokUyA-0-b37d87f9d8b75c37ded529917a616a1d)
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/66_03.jpg?sign=1739387035-cJPCgPnSBcu1hAM0TmGSCZbpDm6FdnBR-0-a04f11808d366a0380c018675c2507b0)
图3-12 发光滤镜
以下是对各个参数的解释:
● color:光晕颜色,采用十六进制格式 0xRRGGBB。默认值为0xFF0000。
● alpha:颜色的 Alpha 透明度值。有效值为0~1。例如,0.25 设置透明度值为25%。
● blurX:水平模糊量。有效值为0~255(浮点)。
● blurY:垂直模糊量。有效值为0~255(浮点)。
● strength:印记或跨页的强度。该值越高,压印的颜色越深,而且发光与背景之间的对比度也越强。有效值为0~255。
● quality:应用滤镜的次数。
● inner:指定发光是否为内侧发光。值 true 指定发光是内侧发光。值 false 指定发光是外侧发光(对象外缘周围的发光)。
● knockout:指定对象是否具有挖空效果。值为 true 将使对象的填充变为透明,并显示文档的背景颜色。
在代码的第44行,将这个发光滤镜放到bitmap对象的滤镜集合里。
(2)颜色矩阵滤镜
颜色矩阵滤镜可以改变图片的原始颜色。
继续之前的项目,给Main类添加一个新方法——drawColorMatrixFilter,参见二维码3-8:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/67_01.jpg?sign=1739387035-1vAgtGyRRh6l7W51wbBIIRvDBJy85b2U-0-055a4f716af1b3793aa5583beaff5585)
二维码3-8
onGroupComplete方法也要做出相应的修改:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/67_02.jpg?sign=1739387035-wr2EOEBfTaTPnwlnUey7VDe3d1bD94pf-0-77ce15d069cd0679a087d75058147c45)
启动调试播放器观看结果,如图3-13所示:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/67_03.jpg?sign=1739387035-udLSJrd850Ghxl0IuQjqCkGbUdZ0pdKt-0-91a3419aa63be2fb8edab55f772a6393)
图3-13 颜色矩阵滤镜
白鹭的右侧绘制出一个灰度化的图片。
在代码的第2行定义了一个实现灰度化效果的颜色矩阵。下图3-14就是颜色矩阵的形式:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/68_01.jpg?sign=1739387035-qmsd86gXNggmLW2R3XMkj51meeqcdpJ2-0-1bb8a637fb834620cd3071e0131b4430)
图3-14 颜色矩阵(图片来源于Egret官方文档)
egret.ColorMatrixFilter类对象的构造依赖于下面的矩阵。颜色的最终值是由以下公式计算出来的,参见二维码3-9:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/68_02.jpg?sign=1739387035-SHbHOMfUHnbyOFll84WBCLt9GXbhDNQ0-0-eca99f842d1d96c49cb36bdcdcda1cd6)
二维码3-9
公式中的srcR、srcG、srcB、srcA表示显示对象里像素的各颜色分量值,a是颜色矩阵。由公式可以看出,没有变化的颜色矩阵为:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/68_03.jpg?sign=1739387035-vzdouS1Mo6c9EnhED12TKCMfL103Owgm-0-2b0db2449cc29e530bea4bd47528f47d)
接下来让原图片变红。需要对drawColorMatrixFilter方法做出修改,参见二维码3-10:
运行调试播放器观看结果,如图3-15所示:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/68_04.jpg?sign=1739387035-s4nnL0eqvKU9BB7R1tIckGBN5LxNoMVX-0-ee49fb98ad69139943cd19ce3f4ab4e2)
二维码3-10
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/68_05.jpg?sign=1739387035-jlkaRTV2SlXuYbvJc5WONRZrKMa9PTii-0-627f52960ad0627a9c7513183f043c00)
图3-15 图片变红
卡牌变成泛红色了。
(3)模糊滤镜
模糊滤镜可以使原图片变模糊。继续上一个项目,给 Main 类添加一个新方法——drawBlurFilter:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/69_01.jpg?sign=1739387035-bI0toONYYRLLSoioKtiutA2v9rvqZtjj-0-a4acac2cf8400ff7b2ff5518f5f0c01b)
onGroupComplete方法也要做出对应的修改:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/69_02.jpg?sign=1739387035-vDgDORRwW490OWnayt6M4DmQfUk7RRHo-0-b08688716cb55f3554c81898e3e0714f)
运行调试播放器观看结果,如图3-16所示:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/69_03.jpg?sign=1739387035-ql2FJgiG747eGBklcOHmvg0z53ebzqf1-0-ea5470c18a1ec071c1cf51962e8c104b)
图3-16 模糊滤镜
新绘制的卡牌变模糊了。
在代码清单的第4行,定义了一个egret.BlurFilter对象,该类的构造函数原型如下:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/70_01.jpg?sign=1739387035-bSisucjUtAmaVqY12t1EjC7G12FgdKat-0-51c590534c3e93b1752299df7a84feb4)
以下是对各个参数的解释:
● blurX:水平模糊量。有效值为0~255(浮点)。
● blurY:垂直模糊量。有效值为0~255(浮点)。
● quality:应用滤镜的次数。
(4)投影滤镜
投影滤镜可以给原图片添加投影效果。
继续上一个项目,给 Main 类添加一个新方法——drawDropShadow Filter,参见二维码3-11:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/70_02.jpg?sign=1739387035-Mq5nuKMnafASMPbg0yTq5ANdkHTkA01u-0-bf9844e2cb2421274b933a346517650c)
二维码3-11
onGroupComplete方法做出对应的修改:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/70_03.jpg?sign=1739387035-QlI9hB9wKqm3llFsYjuuMUV1pqnAy9pL-0-bec4d19721c2f712abe861c633a43f18)
运行调试播放器观看结果,如图3-17所示:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/70_04.jpg?sign=1739387035-01SZmq3EXYbKl4RasqyFbwCKZQgpwL3h-0-7d921927b3bc2fa854194992c295c9eb)
图3-17 投影滤镜
右下侧的白鹭带有了投影效果。
在第一个代码清单的第12行,定义了一个egret.DropShadowFilter类的对象,该类的构造函数的原型如下:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/71_01.jpg?sign=1739387035-QM1Xhr4QadpW59WkK3YYhEoxTykP72Oc-0-8f1c292b72fc2c87a31cdf5c73274b6e)
以下是对各个参数的解释:
● distance:阴影的偏移距离,以像素为单位。
● angle:阴影的角度,0~360度(浮点)。
● color:光晕颜色,采用十六进制格式 0xRRGGBB。默认值为0xFF0000。
● alpha:颜色的 Alpha 透明度值。有效值为0~1。例如,0.25 设置透明度值为25%。
● blurX:水平模糊量。有效值为0~255(浮点)。
● blurY:垂直模糊量。有效值为0~255(浮点)。
● strength:印记或跨页的强度。该值越高,压印的颜色越深,而且发光与背景之间的对比度也越强。有效值为0~255。
● quality:应用滤镜的次数。
● inner:指定发光是否为内侧发光。值 true 指定发光是内侧发光。值 false 指定发光是外侧发光(对象外缘周围的发光)。
● knockout:指定对象是否具有挖空效果。值为 true 将使对象的填充变为透明,并显示文档的背景颜色。
● hideObject:表示是否隐藏对象。如果值为 true,则表示没有绘制对象本身,只有阴影是可见的。默认值为 false(显示对象)。
课后作业:请读者尝试同时使用多种滤镜。