因为某个游戏项目的需要,需要给某个颜色A的object
上覆盖一层50%透明度的其他颜色B,然后继续叠加出C,D,E等等后续颜色。
最直观的土办法是绘制多一个B颜色50%透明度的object
,设置为x
,y
跟随,并且depth - 1
直接叠加即可。但是在其中发现了更加本质的方法,故留下一贴浅见的经验。GMS2里,有很多相关的代码可以做到我的要求(关键词blendmode
),但是本文探讨的是一个更加本质的方法。
先画一个简单的图,供边看边阅读,举个例子也顺便体验一下我的火星之旅。

A是基底色,B是需要叠加颜色的基地色,B透明50%后变成C,A和C叠加变成D,同理D和C叠加变成E。
提前说个概念,下文所指的RGBA是指颜色的Red, Green, Blue, Alpha(透明度)。
A的为 0,66,108,1。
B的RGBA 为 154,220,251,1。
C作为B的50%透明度,RGBA即为 154,220,251,0.5。
D为的RGBA为 76,142,179,1。
颜色 | R(ed) | G(reen) | B(lue) | A(lpha) |
A | 0 | 66 | 108 | 1 |
B | 154 | 220 | 251 | 1 |
C | 154 | 220 | 251 | 0.5 |
D | 76 | 142 | 179 | 1 |
发现规律,得到公式,D的RGB分别是A与C各RGB数值叠加后乘以0.5。
同理得到E的RGBA为 115,181,215,1。
现在就可以利用这个公式来完成项目的需求。
新建object
,sprite_index
用纯白色,然后在Create
事件里设定好RGB,并且直接用上make_color_rgb()
,来达到直接改变物体颜色的方法,好像也比较节省资源。
谢谢顺子的提醒,刚好用的是0.5半透明所以可以直接两个相加*0.5。
如果是叠加其它的透明度值应该是
col1 * (1-mix_alpha) + col2 * mix_alpha。
col_base_red = 0;
col_base_green = 66;
col_base_blue = 108;
col_mix_red = 154;
col_mix_green = 220;
col_mix_blue = 251;
col_mix_alpha = 0.5;
var col_red = col_base_red * (1 - col_mix_alpha) + col_mix_red * col_mix_alpha
var col_green = col_base_green * (1 - col_mix_alpha) + col_mix_green * col_col_mix_alpha
var col_blue = col_base_blue * (1 - col_mix_alpha) + col_mix_blue * col_col_mix_alpha
var col = make_color_rgb(col_red, col_green, col_blue);
image_blend = col;
完。如果有更好更快更巧妙的方法,欢迎大家交流讨论,虚心学习一下。