因为某个游戏项目的需要,需要给某个颜色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。
发现规律,得到公式,D的RGB分别是A与C各RGB数值叠加后乘以0.5。
同理得到E的RGBA为 115,181,215,1。
现在就可以利用这个公式来完成项目的需求。
新建object,sprite_index用纯白色,然后在Creat里设定好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;
完。如果有更好更快更巧妙的方法,欢迎大家交流讨论,虚心学习一下。
我感觉这就像一道无穷级数应用题:
给你无数个50%透明度的纯白图层和无数个50%透明度的纯黑图层,随便叠,你可以叠出0到100%的任意明度。
@方程:嘛,根据需求~能跑就行。
merge_color(col1, col2, amount)
最近由 yellow 修改于:2021-09-25 13:12:19-----------------
刚刚测试了一下,基本可以。
另外发现make_color_rgb再color_get_xxx有时候会有几个整数的误差。
@yellow:改了几次~谢谢各位:)