在 Allegro 5 中只为位图着色一种颜色
Coloring only one color of bitmap in Allegro 5
我正在使用 Allegro 5 库用 C 语言制作一个项目。我为我的蛇买了一些皮,但我想做一些更好的东西,比如用户风格的皮。我认为最好的方法是:
- 像post中的图片那样制作一条白蛇。
- 将白色变为另一种颜色。
现在我正在寻找 Allegro 功能以使其变得快速和简单。
我得到了什么:
- al_tinted_bitmap - 它也在给眼睛和舌头上色
- al_get_pixel, put_pixel - 但我必须给 x/y 白色,这对像这样的位图来说真的很难(我的意思是......用正方形会更容易)
所以我认为,我需要一个函数或类似“get_pixel”的函数,但要指定 rgb(R, G, B),而不是 X/Y。
我应该尝试使用什么来让它发挥那样的功能?
bitmap of snake
这个问题引出了一个很好的问题 discussion on the allegro forums 感谢 Dizzy Egg 详细地解决了这个例子。我把答案总结在这里供以后参考。
使用 al_tinted_bitmap 的解决方案绝对可行,但我会选择 get_pixel / put_pixel 方法,因为您有更多的控制权。用另一种颜色的像素替换一种颜色的像素并不难。只需遍历位图中的每个像素并执行此操作:
color = al_get_pixel(snake_white, x, y);
if(color.r == 1.0 && color.g == 1.0 && color.b == 1.0) {
al_put_pixel(x, y, al_map_rgb(50, 255, 50)); //Choose your own colour!
}
else {
al_put_pixel(x, y, color);
}
这种情况下的问题是,由于蛇轮廓上的抗锯齿,您不仅有一种颜色(白色),还有灰色阴影。所以我们可以做的是检查每个像素的 r、g 和 b 分量是否都非零。如果它们都非零,那么它既不是黑色,也不是红色(舌头)或黄色(眼睛)。然后我们将灰度值与我们自己选择的 r、g、b 分量相乘。
color = al_get_pixel(snake_white, x, y);
if(color.r >= 0.01 && color.g >= 0.01 && color.b >= 0.01) {
al_put_pixel(x, y, al_map_rgba_f(new_color.r * color.r, new_color.g * color.g, new_color.b * color.b, color.a));
}
else {
al_put_pixel(x, y, color);
}
你可以在很多方面让它变得更聪明,但它对蛇图像很有效。有关完整代码,请参阅链接的论坛主题。
我正在使用 Allegro 5 库用 C 语言制作一个项目。我为我的蛇买了一些皮,但我想做一些更好的东西,比如用户风格的皮。我认为最好的方法是:
- 像post中的图片那样制作一条白蛇。
- 将白色变为另一种颜色。
现在我正在寻找 Allegro 功能以使其变得快速和简单。 我得到了什么:
- al_tinted_bitmap - 它也在给眼睛和舌头上色
- al_get_pixel, put_pixel - 但我必须给 x/y 白色,这对像这样的位图来说真的很难(我的意思是......用正方形会更容易)
所以我认为,我需要一个函数或类似“get_pixel”的函数,但要指定 rgb(R, G, B),而不是 X/Y。 我应该尝试使用什么来让它发挥那样的功能?
bitmap of snake
这个问题引出了一个很好的问题 discussion on the allegro forums 感谢 Dizzy Egg 详细地解决了这个例子。我把答案总结在这里供以后参考。
使用 al_tinted_bitmap 的解决方案绝对可行,但我会选择 get_pixel / put_pixel 方法,因为您有更多的控制权。用另一种颜色的像素替换一种颜色的像素并不难。只需遍历位图中的每个像素并执行此操作:
color = al_get_pixel(snake_white, x, y);
if(color.r == 1.0 && color.g == 1.0 && color.b == 1.0) {
al_put_pixel(x, y, al_map_rgb(50, 255, 50)); //Choose your own colour!
}
else {
al_put_pixel(x, y, color);
}
这种情况下的问题是,由于蛇轮廓上的抗锯齿,您不仅有一种颜色(白色),还有灰色阴影。所以我们可以做的是检查每个像素的 r、g 和 b 分量是否都非零。如果它们都非零,那么它既不是黑色,也不是红色(舌头)或黄色(眼睛)。然后我们将灰度值与我们自己选择的 r、g、b 分量相乘。
color = al_get_pixel(snake_white, x, y);
if(color.r >= 0.01 && color.g >= 0.01 && color.b >= 0.01) {
al_put_pixel(x, y, al_map_rgba_f(new_color.r * color.r, new_color.g * color.g, new_color.b * color.b, color.a));
}
else {
al_put_pixel(x, y, color);
}
你可以在很多方面让它变得更聪明,但它对蛇图像很有效。有关完整代码,请参阅链接的论坛主题。