Skip to content
第10回 エフェクトと演出

2 / 4 時間でエフェクトを更新する

このステップの目的

エフェクトの経過時間から大きさと透明度を計算し、表示時間を終えたら停止する

経過時間を進める

エフェクトもゲームの更新処理からdeltaTimeを受け取ります。 ageが設定したDuration以上になったら実行状態をfalseへ戻します。

EffectManager.cppcpp
effect.age += deltaTime;
if (effect.age >= tuning::effect::Duration)
{
    effect.isActive = false;
    continue;
}

表示を計算する

経過時間を表示時間で割ると、開始から終了までの割合を求められます。 その割合から半径と透明度を計算し、中心位置へ円を描きます。

エフェクトの表示時間と大きさはGameTuning.hへ置き、コードを変更せず比較できるようにします。

表示時は、経過割合から円の半径と透明度を求めます。 progressは0から1の範囲なので、開始時は小さく濃く、終了時は大きく薄い円になります。

EffectManager.cppcpp
for (const Effect& effect : effects)
{
    if (!effect.isActive)
        continue;

    const float progress = effect.age / tuning::effect::Duration;
    const float radius = tuning::effect::StartRadius +
        (tuning::effect::EndRadius - tuning::effect::StartRadius) * progress;
    const int alpha = static_cast<int>(255.0f * (1.0f - progress));

    SetDrawBlendMode(DX_BLENDMODE_ALPHA, alpha);
    DrawCircle(
        static_cast<int>(effect.center.x),
        static_cast<int>(effect.center.y),
        static_cast<int>(radius),
        GetColor(255, 220, 80),
        FALSE);
}

SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
チェックリスト
  • agedeltaTimeで進めている
  • 表示時間を終えたエフェクトを停止している
  • 経過割合から表示の大きさを変えている
  • エフェクトの調整値をTuningへまとめている