Hi , 大家好。
最近啊,Mr.期杉在开发"数字雨"项目的过程中,遇到了一个难题:如何给界面上不同的符号设置不同的亮度。在深入的研究之后,发现了setPenColor语句的新用法,特此分享。
先来详聊一下遇到的问题。先看一下以下两张图,哪一张的展示效果更好呢?很明显,右边那张每一列有渐变的效果比左边的看上去更加的具有科技感。
为了实现右边的效果,我特地去查了下VEXCode的API文档,查到了setPenColor一共有四种用法。
通过实践发现,前两种用法vex::brain::lcd::setPenColor(T color)
和vex::brain::lcd::setPenColor(color const &color)
只能够通过传入指定的颜色名称,来给画笔设置相应的颜色,无法实现同一种颜色不同亮度的效果。
第四种vex::brain::lcd::setPenColor(int hue)
需要我们传入一个代表hue值的整数。通过查找资料,我发现了一些有意思的概念。
hue直译为色调,表示一种颜色区别于另一种颜色的特征。色调通常是颜色、色调、阴影和色调的同义词。更具体地说,在物理学方面,色调是一个人所能看到的光的主要波长——黄、红、蓝、绿等。
简单的说就是,hue只能区分不同的颜色,无法实现亮暗之间的过渡效果。因此,第四种用法也不行。
第三种vex::brain::lcd::setPenColor(const char *color)
需要我们传入一个代表颜色的字符串,也就是所谓的颜色码,如"#00FF00"(以#开头,6位数字分为3组,每组两位,依次表示红、绿、蓝三种颜色的强度),是RGB颜色值所对应的十六进制的表示形式。通过查阅,发现,RGB是能够实现同一种颜色的不同亮度的。
以绿色为例,在画图软件的编辑颜色功能中,当我们把颜色码的第一组和第三组全都设置成“00”,第二组设置成“00”->“FF”,发现,颜色从暗绿色慢慢的变成了亮绿色。(十六进制的00=十进制的0,十六进制的FF=十进制的255)
找到思路之后,对每一条的数字雨按照个数不同,均匀的分配00->FF之间的值,即可实现最终的效果。(视频最终效果见关联视频号下的VEX之黑客帝国)
详细的视频展示效果,请搜索wx公众号:"期杉机器人编程"下的视频号进行查看。