fadeColor (日本語)

fadeColor は滑らかな配色遷移に適した退色効果を使用するための関数です。

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
   
  -- 退色処理を完了して、全て nil を返します。
end

引数:

  • time は配色を評価するための 0 基数の時間です。
  • prologue は結果とする配色に至るまでの時間であり完全に不透明度は fade_in の配色と等価です。
  • attack は完全不透明な fade_in から完全透明な fade_in まで移行するために掛かる時間。
  • sustain は結果として完全に透明な fade_in の配色に至るまでの時間です。
  • decay はは完全透明な fade_out から完全不透明な fade_out まで移行するために掛かる時間。
  • epilogue は結果とする配色に至るまでの時間であり完全に不透明度は fade_out の配色と等価です。
  • fade_in_[rgb] は fade_in の要素です。
  • fade_out_[rgb] は fade_out の要素です。

遷移完了時に関数は nil を返します。遷移から完全不透明へ完全透過するためにコサイン関数による評価にて円滑に行います。使用方法:

-- これは更新用ループの一部であり、ここで必要となる者を全て描画します。

-- 白色から黒色の画面へ退色させるための配色を評価します。
local r, g, b, a = fadeColor(
  dt,
  2,   -- 二秒間は不透明な白色です。
  2,   -- 二秒間は透明になります。
  3,   -- 三秒間は透明になります。
  2,   -- 二秒後は不透明な黒色へ移行します。
  0,   -- 零秒間は不透明な黒色になります。
  255, 255, 255, -- 白色。
  0, 0, 0 -- 黒色。
)

-- 退色処理を終える場合に、その他に効果のあることを行うこと...
if not r then
  -- その他の状態への状態遷移...
  return
end

-- 結果の配色にて完全に画面を塗りつぶします。
love.graphics.setColor( r, g, b, a )
love.graphics.rectangle( 'fill', 0, 0, love.graphics.getWidth(), love.graphics.getHeight() )