fadeColor
fadeColor is a helper function to make smooth color transitions suitable to fading effects.
function fadeColor( time, prologue, attack, sustain, decay, epilogue, fade_in_r, fade_in_g, fade_in_b, fade_out_r, fade_out_g, fade_out_b ) -- [0, prologue) if time < prologue then return fade_in_r, fade_in_g, fade_in_b, 255 end -- (prologue, prologue + attack] time = time - prologue if time < attack then return fade_in_r, fade_in_g, fade_in_b, ( math.cos( time / attack * math.pi ) + 1 ) / 2 * 255 end -- (prologue + attack, prologue + attack + sustain] time = time - attack if time < sustain then return fade_in_r, fade_in_g, fade_in_b, 0 end -- (prologue + attack + sustain, prologue + attack + sustain + decay] time = time - sustain if time < decay then return fade_out_r, fade_out_g, fade_out_b, 255 - ( ( math.cos( time / decay * math.pi ) + 1 ) / 2 * 255 ) end -- (prologue + attack + sustain + decay, prologue + attack + sustain + decay + epilogue] time = time - decay if time < epilogue then return fade_out_r, fade_out_g, fade_out_b, 255 end -- End of fading, return all nils. end
Arguments:
- time is the 0-based time to evaluate the color.
- prologue is how much time the resulting color will be equal to the fully opaque fade_in color.
- attack is how much time it takes to go from fully opaque fade_in to fully transparent fade_in.
- sustain is how much time the color resulting color will be the fully transparent fade_in.
- decay is how much time it takes to go from fully transparent fade_out color to fully opaque fade_out color.
- epilogue is how much time the resulting color will be equal to the fully opaque fade_out color.
- fade_in_[rgb] are the components of the fade_in color.
- fade_out_[rgb] are the components of the fade_out color.
The function returns nil when the transitions are over. The transitions from fully opaque to fully transparent are evaluated with the cosine function to make it smooth. Usage:
-- This is part of your update loop, draw whatever you need here. -- Evaluate a color that makes the screen fade from white and then to black. local r, g, b, a = fadeColor( dt, 2, -- Two seconds opaque white. 2, -- Two seconds to make it transparent. 3, -- Three seconds transparent. 2, -- Two seconds to go to opaque black. 0, -- Zero seconds opaque black. 255, 255, 255, -- White. 0, 0, 0 -- Black. ) -- If the fading is done, better go do something else... if not r then -- Change state to something else... return end -- Fill the entire screen with the resulting color. love.graphics.setColor( r, g, b, a ) love.graphics.rectangle( 'fill', 0, 0, love.graphics.getWidth(), love.graphics.getHeight() )