他のライブラリでは大体、時間のデータといえば ミリ秒を unit32型で表すとか、float型で秒を表すとかですけど、
SFMLは型や単位を固定してません。sf::Time というクラスを使うと、どんな型や単位を使うか選べるようになってます。
SFMLの中の、時間データを扱うクラスや関数は、どれも このクラスを使ってます。
sf::Timeクラスが内部に持っているのは 時間の相対的な量(タイムスパン)です。
いわゆる日付クラスとも違ってて、現在の年月日や時分秒を持ってるわけでもありません。
時間の「量」を表していて、それが具体的にどういう意味なのかは、時と場合による、ということなのです。
いろいろな単位で sf::Time の値を作ることができます。秒、ミリ秒、マイクロ秒。
それぞれの単位の値をもとにして、sf::Timeの値を作る関数があります。
sf::Time t1 = sf::microseconds(10000);
sf::Time t2 = sf::milliseconds(10);
sf::Time t3 = sf::seconds(0.01f);
上記サンプルの3つの値はどれもイコールであることに注目。
同じように、1つのsf::Timeの値を、秒やミリ秒やマイクロ秒の値に変換することもできます。
sf::Time time = ...;
sf::Int64 usec = time.asMicroseconds();
sf::Int32 msec = time.asMilliseconds();
float sec = time.asSeconds();
sf::Timeは時間の 単なる「量」なので、足し算や引き算や比較などの計算ができます。マイナスの値を取ることもできます。
sf::Time t1 = ...;
sf::Time t2 = t1 * 2;
sf::Time t3 = t1 + t2;
sf::Time t4 = -t3;
bool b1 = (t1 == t2);
bool b2 = (t3 > t4);
さて、SFML で時間の値をいじる方法を見てまいりました。
それでは、みなさんお待ちかねのアレのやり方を見てみましょう。経過時間を測定、です。
sf::Clockクラス。SFMLが提供するシンプルな時間計測クラスです。
関数はたったの2つ。
getElapsedTime関数で、計測開始からの経過時間を取得。
restart関数で、時計を再開。
sf::Clock clock; // 計測開始
...
sf::Time elapsed1 = clock.getElapsedTime();
std::cout << elapsed1.asSeconds() << std::endl;
clock.restart();
...
sf::Time elapsed2 = clock.getElapsedTime();
std::cout << elapsed2.asSeconds() << std::endl;
restart関数も戻り値で経過時間を返していることに注目。
getElapsedTime関数を呼んでから restart関数を実行までに発生するわずかなギャップを埋めることができます。
以下はゲームループの毎フレームの経過時間を取得するサンプルです。
取得した経過時間をゲーム本体の処理の中で使っている、という想定です。
sf::Clock clock;
while (window.isOpen())
{
sf::Time elapsed = clock.restart();
updateGame(elapsed);
...
}