Second layer is not transparant. Guess you missed that.
Yes, i got this about the 'moving' characters. In fact i still think it is gonna be a lot easyer with animations, even if they have allready animations. That way you only have to start an animation and dissolve background layer in and out. I can do that 4 you, if you wish, make for every animation a version that dissolves to its invert state and back. (i dont charge)
About the lerp. Every lerp is the same. lerp(a,b,step). Where 'step' is just a number between 0 and 100. When 'step' = 0, the lerp returns a. (0% between a and b) When 'step' = 1(100 % between a and b) it returns b. When 'step' = 0.4 the lerp returns a value that is 40 % between a and b.
So all you need for a perfect lerp is a start value, a end value and number that counts from zero to 1 over some time.
But lerp (as all very basic things in construct) is not dt corrected. And it should be. Else 3 seconds is in fact 3 seconds on a fast device but like 6 seconds on a slow device.
Also, lerp has no 'on arrived' conditions. Its not that easy (for me) to know during run time, when it is done with its magic.
And here comes the timer behavior as a perfect soulmate. It is dt corrected. And you can do 3 major things with it.
1/ It is private. Meaning, every instance can have its personal timer.
2/ De moment you start a timer, you can read where it is at the moment by reading its expression Sprite.Timer.CurrentTime
3/ It warns us when its done using the condition 'on timer'.
So in the example i made, i start a timer (since you stated that the dissolve has to take 3 seconds) for 3 seconds. Now the expression Sprite.Timer.CurrentTime returns a number between 0 and 3. Since it goes from 0 seconds to 3 seconds.
But we need a number between 0 and 1. Not between 0 and 3. So all we do is lerp(100,0,Sprite.Timer.CurrentTime("steps")/second) to archive that.
100 = opacity 100
0 = opacity 0
"steps" is the name of the timer, you can have more timers (one that accounts for the pauzes for ecample)
Sprite.Timer.CurrentTime("steps") counts from 0 to 3 in exact 3 seconds
Sprite.Timer.CurrentTime("steps")/second counts from 0 to 1 in exact 3 seconds
Back to dissolving from non-inverted to inverted. When that is the way you want to go, then you always need a copy of the character running arround. To dissolve to and from. Gonna be kinda hell to code. Why i think animations are a much much easyer solution.