SFML community forums

Help => Graphics => Topic started by: natchos on March 09, 2014, 08:25:16 pm

Title: [Solved]Colouring coloured tiles using sf:color
Post by: natchos on March 09, 2014, 08:25:16 pm
In my current project I have tiles which represent a certain type of terrain. Each of these types have their own coloured tile image. This all works very well but I also want to be able to represent a water/water depth value on top of a tile if there is water.
I would like to colour the tiles as they are outputted by setting the tiles color with a sf::color value where an higher water depth would mean an stronger blue.

I am currently using the following code:
        if(Displayed_Tiles[x][y].is_Water())
                        {
                                Rendering_Tiles[x][y].setColor(sf::Color(125,125,255/(Displayed_Tiles[x][y].Get_Water_Saturation()),255/2));
                        }

Where Displayed_Tiles
The problem is that it doesn't work, in two ways. The tiles aren't colored blue, no matter the water depth and the tiles color does not change if their water depth is decreased/increased.
Anyone have any clue of why the code isn't working or what steps I should take to remedy it?(Or recommend me a better system to colour the tiles according to a water depth variable?).

Sorry if an topic similar to this has been posted. Searched around on the graphics and general boards but couldn't find anything relevant to this topic.
Title: Re: Colouring coloured tiles using sf:color
Post by: Lee R on March 09, 2014, 11:32:13 pm
Dividing 255 by any number less than 1 results in a value above of the range supported by sf::Uint8 (e.g. 255 / 0.5 = 510).

Another thing to consider is that the colour passed to sf::Sprite::setColor is applied to the texture by a multiplication. You should generally think of it as if it were named 'setColorModulation'. The implication is that in order to make the texture appear 'more blue', it actually has to be made 'less red and green'.

sf::Color waterTint(float saturation, sf::Uint8 value = 255)
{
    // Implicit hue of 240.
    return sf::Color(
        static_cast<sf::Uint8>(255.0f * (1.0f - saturation)),
        static_cast<sf::Uint8>(255.0f * (1.0f - saturation)),
        value,
        255
    );
}

int main()
{
    float saturation = 1.0f;
    sf::Color colour = waterTint(saturation);
    return 0;
}
 

This code assumes that 0 = minimum depth, 1 = maximum depth. The colour it generates should be applied directly to the tile being rendered, not to some overlay. It's completely untested but it looks right to me :P I came up with it by playing with the sliders on this site:

http://www.rapidtables.com/convert/color/hsv-to-rgb.htm

EDIT: Although there are blend modes for additive blending.
Title: Re: Colouring coloured tiles using sf:color
Post by: natchos on March 11, 2014, 10:23:06 pm
Thanks for the response. I managed to fix it with a somewhat similar setup
Rendering_Tiles[x][y].setColor(sf::Color((1/Displayed_Tiles[x][y].Get_Water_Depth())* 100,(1/Displayed_Tiles[x][y].Get_Water_Depth())* 100,Displayed_Tiles[x][y].Get_Water_Depth()*3,255));
As well as rebinding the background of that specific tile to a white square, as opposed to the the background of the tile type, which was what I used before.
Although the macro is a bit off it hits somewhat close to the mark and provides the ability to distinguish between water depth, which is what was important anyway.