ストップウォッチの作成(カウンター、タイマーへ応用可) ナビつき!つくってわかる はじめてゲームプログラミング 逆引きパターン集

2021年7月8日はじプロ

ゲーム中にストップウォッチのように時間のカウンターを表示する

当初よりもかなり簡単なプログラムで実現できたので、内容を更新しました。

あるタイミングからの経過時間が分かれば、タイマーを表示したり、残り時間が3秒になったときにカウントダウンエフェクトを起動したり、などの演出ができるようになる。

当初、色々と誤解をしていたので複雑なプログラムになっていました。

マッピングノードンで1/60した場合(「0~60」→「0~1」に置き換えた場合)、0.1や0.05などを判定できないと思っていた。
→ 0.05単位でも比較できた。

カウンターノードンは整数でしかカウントできないと思っていた。
→ 小数を入力すれば小数をカウントできる。

カウンターノードンは1000までしかカウントできないと思っていた。
→ 初期値が1000なだけで、1000より大きな数値でもカウントできる。

😊ノードン一覧や逆引きパターンなど、「はじプロ」関連の記事の一覧はこちらからどうぞ

完成図

解説

操作方法

Aボタンでスタート、Bボタンでストップ、Xボタンでリセットとしている。

プログラムの説明

ストップウォッチを動作させるのかどうかをフラグノードンで管理している。

このフラグノードンの「オンのポートに、ストップウォッチを開始する瞬間だけ信号が流れるノード」、「オフのポートに、ストップウォッチを停止する瞬間だけ信号が流れるノード」を接続する。
今回は、Aボタンを押した瞬間だけ信号を流すボタンノードン、Bボタンを押した瞬間だけ信号を流すボタンノードンを接続してボタン操作できるようにしている。

フラグノードンカウンターノードンを接続し、フラグがオンならカウンターをカウントアップさせている。
カウンターノードンの設定は「モード」は「制限なし」、「カウントするタイミング」は「0以外のときずっと」)
カウンターノードンは1秒間に60カウントするので、マッピングノードンで「入力はんい」が「0.00~60.00」のとき「出力はんい」が「0.00~1.00」となるように変換する。

このマッピングノードンの出力結果が、経過時間になる。
60分の1に変換されるので0.1秒などは計測できないのかと思いきや、試してみたところくらべるノードンで0.05秒単位の比較ができた。(逆に、0.05秒単位ではない場合は比較できなかった)

今回は、Xボタンを押した瞬間だけ信号を流すボタンノードンカウンターノードンの「リセット」に接続して、タイマーをリセットできるようにしている。

改良版のストップウォッチ ロジック自体は3つのノードンで実現できる

当初作成した複雑なプログラム

たった3つのノードンで実現できるのに、当初は色々な思い込みで複雑なプログラムを作ってしまいました。
一応、当初のプログラムの説明も残しておきます。

完成図

このサンプルプログラムでは、1000秒まで0.1秒単位で計測できる。

ストップウォッチの作成完成図

解説

操作方法はAボタンでスタート、Bボタンでストップ、Xボタンでリセットとしている。

ストップウォッチのオン/オフを切り替える

ストップウォッチのオン/オフ切り替え部分

ストップウォッチを動作させるのかどうかを、図のフラグノードンで管理している。

このフラグノードンの「オンのポートに、ストップウォッチを開始する瞬間だけ信号が流れるノード」、「オフのポートに、ストップウォッチを停止する瞬間だけ信号が流れるノード」を接続する。

今回は、Aボタンを押した瞬間だけ信号を流すボタンノードン、Bボタンを押した瞬間だけ信号を流すボタンノードンを接続してボタン操作できるようにしている。

0.1秒ごとにカウントする

ストップウォッチの小数のカウント部分

図の部分で、ストップウォッチの動作中はタイマーノードンが0.1秒ごとに信号を出し、その瞬間をカウンターノードンでカウントしている。
※0から変わった瞬間のみカウントするよう設定しないと、0.1秒ごとに複数カウントされてしまう。

タイマーノードンとカウンターノードンの間にANDノードンが挟まっているのは、ストップウォッチ停止後のタイマーノードンの最後の信号をカウントしないためのもの。

また、カウンターノードンのカウント上限は1000まで(※左記誤りでした 正しくは初期値として設定できるのが1000まで)なので、このカウンターノードンだけでは最大1分40秒(0.1秒が1000回=100秒)しか測れない。
そのため、このカウンターノードンでは小数部分だけを計測するものとし、下図のように0~10の範囲でループするように設定している。
整数部分は次に説明する別のカウンターノードンで測る。

ストップウォッチの小数のカウント部分(カウンターノードンの設定)

1秒ごとにカウントする

ストップウォッチの整数のカウント部分

図の部分で整数の範囲をカウントしている。
「0.1秒ごとにカウントするカウントノードン」が10カウントして0に戻ったタイミング(=1秒)をNOTノードンで取り出しその瞬間を右下のカウンターノードンでカウントしている。

NOTノードンとカウンターノードンの間にANDノードンが挟まっているのは、0.1秒ごとにカウントするカウントノードンの初期状態の0をカウントしないためのもの。
ストップウォッチを開始した時点ではフラグをオフにしておき、0.1秒後のカウント時にオンにすることで、それ以降の繰り上がりをカウントできるようにしている。

経過時間を計算する

ストップウォッチの経過時間の計算部分

すでに0.1秒ごとのカウントと、1秒ごとのカウントができているので、その値を使って経過時間を計算できる。

0.1秒ごとのカウンターノードンの「1カウント=0.1秒」なので、マッピングノードンで「0~10」を「0~1」に置き換えてから、1秒ごとのカウンターノードンのカウントと足し算している。

ストップウォッチの経過時間の計算部分(マッピングノードンの設定)

ストップウォッチをリセットする

図のように、カウンターノードンのリセット、最初の0を無視するフラグのオフに対して信号を出せば、カウンターをリセットできる。

今回は、「Xボタンを押した瞬間だけ信号を流すボタンノードン」を接続してボタンで操作できるようにしている。

これでストップウォッチは完成!

(応用)タイマーとして使用し、一定時間でストップする

ゲームの制限時間として使う場合など、一定時間経過後にストップウォッチを停止させる場合は、停止させる条件を満たしたら、ストップウォッチのフラグをオフにすればよい。
このとき、オフにする信号が出続ける状態だと、再度ストップウォッチをオンにできないので要注意。
必要に応じて、0から変わったしゅんかんノードンを使おう。

当初公開したプログラム、複雑です…