0

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

4

1 回答 1

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)。

于 2015-11-13T15:54:45.763 回答