ポーズの実装方法
ゲームにおけるポーズ(一時停止)の実装方法です。
これは一例です。よりスマートな方法があれば知りたいです。
まず、この記事のように ISteadyClock を実装した CustomClock クラスを作ります。
シーンの中で、CustomClock を作成します。
ポーズしたい場面で、CustomClock をポーズします。
code:cpp
CustomClock clock{ StartImmediately::Yes };
...
// Pキーが押されたらポーズするの例
if (KeyP.down())
{
clock.pause();
}
時間を扱う箇所すべてで、この clock を参照します。
code:cpp
// Stopwatch
Stopwatch sw{ StartImmediately::Yes, &clock };
// Timer
Timer timer{ 1s, StartImmediately::Yes, &clock };
// Periodic
const double x = Periodic::Sine0_1(1s, clock.getSec());
// などなど…
Effect を使用する場合は、エフェクトもポーズします。
code:cpp
Effect effect;
...
// Pキーが押されたらポーズするの例
if (KeyP.down())
{
clock.pause();
effect.pause(); // エフェクトもポーズする
}
code:cpp
// タスク関数
Co::Task<> foo()
{
...
}
...
// シーンの中でタスク生成するときにポーズ条件を加える
const auto runner = foo()
.pausedWhile(&{ return clock.isPaused(); }) .runScoped();
基本は以上です。
毎回 Timer などのコンストラクタに CustomClock を渡すのが面倒かも。