ポーズの実装方法
#OpenSiv3D #ISteadyClock #CoTaskLib
ゲームにおけるポーズ(一時停止)の実装方法です。
これは一例です。よりスマートな方法があれば知りたいです。
まず、この記事のように ISteadyClock を実装した CustomClock クラスを作ります。
Stopwatchを一括して停止・再開したり、遅く/速く進行させる(ISteadyClockの実装例)
シーンの中で、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(); // エフェクトもポーズする
}
CoTaskLib を使用する場合は、README #タスクの一時停止 に従って、タスク生成時に pausedWhile 関数に条件を渡します。
code:cpp
// タスク関数
Co::Task<> foo()
{
...
}
...
// シーンの中でタスク生成するときにポーズ条件を加える
const auto runner = foo()
.pausedWhile(&{ return clock.isPaused(); })
.runScoped();
基本は以上です。
毎回 Timer などのコンストラクタに CustomClock を渡すのが面倒かも。