Hue-shifting might make more sense if you understand the three components of a colour:
Value is how dark or light a colour is. A lower value means a darker colour, while a higher value means a lighter colour.
Saturation is how intense a colour is. Low saturation means the colour is grey-ish (0 saturation = grey), high saturation means it's intense. Neon colours have high saturation, earthy ones have low saturation.
Hue is the "colour" identity. Red, yellow, violet, blue, cyan, etc, these are hues. Combined with saturation and value, you get specific colours.
![](https://jaalsblog.files.wordpress.com/2015/02/hsv-samples.jpg)
When I speak of "ramps", I am referring to the colour "gradients" that your objects use, typically these cover a range of values, so you might have a ramp of dark, midtone, and light greens for a tree, so that you can have both shaded and lit areas.
Hue-shifting means making the hue vary between different parts of the ramps instead of keeping the hue the same throughout.
![](https://i.pinimg.com/564x/14/03/8d/14038dc4c2def31730c581af40f28681--ds-games-pixel-art.jpg)
Gradients are just a matter of choosing your colours, and the number of steps the gradients will have, aren't they? So, to avoid a "pixelated" look you just need more steps.
To help the gradients look better, choose start and end colours of different hues (i.e. hue-shifting). If possible, consider passing through a third colour in the middle, to add more variety/"life" to the gradient.
Another factor is your actual math for calculating the in-between colours. Some formulas give nicer results than others. Calculating RGB values directly tends to make the middle colours look greyish and dull, working with HSV or Lab numbers tends to give better results that naturally pass through other hues in the middle, rather than going through grey.
For your clouds, maybe consider generating them more like how you generate those narrow trees - out of a bunch of solid-coloured circles. That'll give you a fluffy cloud look. Have the darkest circles at the bottom, and draw the lighter circles above and in front of the darker ones. If you give each circle a random offset when it's generated, you can get some pretty nice results:
![](https://i.imgur.com/RJccTMi.png)
This example uses circles of all the same sizes, but you can also vary the circle sizes. It also only needs a few different colours to be generated to look nice. I don't know how dynamic the clouds are in your game, but this style of generating them can be moved, it can fade out, and can even change over time (the circle offsets can change, and the colours assigned to each circle can change), it works pretty well with procedural generation and procedural animation.
The same method could work for the larger round trees, too.