Colors 在简单函数中插值颜色

Colors 在简单函数中插值颜色,colors,gradient,interpolation,pawn,Colors,Gradient,Interpolation,Pawn,使用下面的代码,我应该能够执行WC_插值颜色0xff0000、0xFFFF00、0.5,并获得介于本例中指定的红色和黄色两种颜色之间的颜色。pos值应介于1.0和0.0之间。代码显然还没有完成,我不知道下一步该怎么做。还有其他人试过这样做吗?有人能告诉我怎么做吗?现在,在这种情况下,代码总是返回黄色的结束颜色。提前谢谢,请解释一下,以便我能从中学习 WC_InterpolateColor(start, end, Float:pos) { new start_bytes[1], end_b

使用下面的代码,我应该能够执行WC_插值颜色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];
}

使用的语言是典当,一种非常类似于C++的语言。关键字new类似于执行int或float,在本例中是int。

事实上,您已经非常接近您的目标:只需将start_bytes{i}=替换为end_bytes{i}=

但是,我也尝试创建一个类似的函数,我考虑到颜色字节实际上是颜色分量强度的平方根,所以我首先将其平方,然后混合它。以下是一段摘录:

我们得到了同样的想法,将颜色存储在一个单元格数组中,然后访问单个字节,但是4个字符与具有较小单元格大小的机器兼容,对于4个字节的单元格,它相当于1

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);
}