在简单的功能中插入颜色

时间:2015-02-17 22:20:26

标签: colors gradient interpolation pawn

使用以下代码,我应该能够执行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。

1 个答案:

答案 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) - 字节)。