クリアするまでにかかった時間を調べる
こんばんは! 表示の方はハイスコアの作り方と同じでいいと思います(たぶんどこかに情報が……)。タイムの計測は、プレイ開始時点と終了時点でそれぞれ現在時刻をGETしてその差を調べます。詳しくは記事で #peing #質問箱 https://t.co/jJ7BVwhqfh pic.twitter.com/nxJF1d8xqI
— うなうなぎ@ポリバケツ (@unaunagi1) 2018年1月27日
「今日も質問がきていた。通算4通目。厳密にいうと5通……」
「で、クリアタイムをランキング形式で表示したいということで、必要な物がいくつかある」
・クリアタイムの測定
・ランキングっぽい物の表示
・名前の入力
・ランキングのセーブ
・オンライン対応
「こんな感じかな。セーブなし名前なしオンラインなしで、上の2つだけやるというのが一番シンプルで簡単だと思う」
妹「ハイスコアの表示とセーブはやったことあるけど、ランキングはないなあ」
「1人プレイの場合だとハイスコアだけわかればいいからね。アーケードゲームだとランキングが多かったし、その移植版でもそのままランキングがついてること多かった。セーブはできたりできなかったり」
妹「どうやって作ればいいものか」
「ランキングの表示に関しては、UMGでつくるのがいいと思うけど、ちょっと説明するのがむずかしい。ただ、おそらくハイスコアランキングの作り方みたいな情報はどこかにあると思う。スコアの部分をクリアタイムに置き換えて、少ない方が上位になるようにすれば問題はない」
妹「制限時間のは作ったことあるけど、クリアタイムは作ったことないかも」
「クリアタイムの調べ方も制限時間を作る場合に似てるので、この記事が参考になる。この中のDelta Sceondsを使う方法とTimespanとDatetimeを使う方法が使える。ただ制限時間基準に減らしていくんじゃなく、0から足していく感じでやる必要があるけど」
妹「どっちの方法がいいの?」
「どちらでもいいけど、TimespanとDatetimeを使う方法が簡単な気がする。Tickで毎回計算しなくていいし。まずゲーム開始時に調べて、クリアするか死ぬかした時にも調べて、その差を表示する」
クリアした時のNow - ゲーム開始時のNow
「というような式を作って、その結果から秒とか分とかの部分を取り出して表示する。ただ難しいのが途中でポーズ(一時停止)がある場合」
妹「普通にやるとポーズ中の時間も計算しちゃう?」
「そうなる。まあタイムアタック形式のゲームだとポーズはなしでいいかもしれないけど。もしポーズ有りだったら、ポーズの時にそこで止めて経過時間を別変数に記録して、ポーズ解除からまた計り直して、最後にポーズ前のと合算するとか。ポーズを複数回した場合の対処も必要」
妹「めんどくさそう」
「その場合はDelta Sceondsを使う方が楽かもしれない。ポーズ中にTickが動かないなら時間の加算も止まるし。ポーズ中もTickを動かす場合も、ポーズ中かどうかで分岐するだけでいいから簡単。ただゲームのフレームレートを固定にした場合はDelta Sceondsを足していった結果が実時間とズレてたような気がする」
※1/31追記 関連記事を書きました
imoue.hatenablog.com