使用以下代码,我应该能够执行WC_InterpolateColor(0xFF0000,0xFFFF00,0.5)并获得指定的两种颜色之间的颜色(在这种情况下为红色和黄色)。 pos值应介于1.0和0.0之间。代码显然未完成,我不知道接下来要去哪里。还有其他人试过做这样的事吗?有人可以告诉我如何正确地做到这一点?现在代码总是返回结束颜色(在这种情况下为黄色)。提前谢谢,请解释一下,我可以从中学习。
WC_InterpolateColor(start, end, Float:pos) {
new start_bytes[1], end_bytes[1];
start_bytes[0] = start;
end_bytes[0] = end;
for (new i = 0; i < 4; i++) {
start_bytes{i} = floatround(start_bytes{i} * (1.0-pos) + end_bytes{i} * pos);
}
return end_bytes[0];
}
聚苯乙烯。使用的语言是Pawn,一种非常类似于C ++的语言。关键字new就像执行int或float,在本例中为int。
答案 0 :(得分:0)
事实上,您非常接近目标:只需将start_bytes{i} =
替换为end_bytes{i} =
。
然而,我也尝试制作类似的功能,并且我已经考虑到颜色字节实际上是颜色分量强度的平方根,所以我先将它平方然后混合它。这是i_colors的摘录:
stock BlendColors(col1, col2, Float:t)
{
new c1[4 char], c2[4 char];
GetColorComponentsArray(col1, c1);
GetColorComponentsArray(col2, c2);
if(c2{3} == 0)
{
return CreateColorRGBA(
c1{0}, c1{1}, c1{2},
BlendAlphaComponent(c1{3}, c2{3}, t)
);
}else{
return CreateColorRGBA(
BlendColorComponent(c1{0}, c2{0}, t),
BlendColorComponent(c1{1}, c2{1}, t),
BlendColorComponent(c1{2}, c2{2}, t),
BlendAlphaComponent(c1{3}, c2{3}, t)
);
}
}
static stock GetColorComponentsArray(color, components[4 char])
{
components[0] = color;
}
static stock CreateColorRGBA(r, g, b, a=0xFF)
{
return (r << 24) | (g << 16) | (b << 8) | a;
}
static stock BlendColorComponent(c1, c2, Float:t)
{
return floatround(floatsqroot((1.0-t)*c1*c1 + t*c2*c2));
}
static stock BlendAlphaComponent(a1, a2, Float:t)
{
return floatround((1.0-t)*a1 + t*a2);
}
我们有同样的想法将颜色存储在一个单元格数组中,然后访问单个字节,但4 char
与单元格尺寸较小的机器兼容(如果是4,则相当于1) - 字节)。