ストップウォッチの作成(カウンター、タイマーへ応用可) ナビつき!つくってわかる はじめてゲームプログラミング 逆引きパターン集
ゲーム中にストップウォッチのように時間のカウンターを表示する
当初よりもかなり簡単なプログラムで実現できたので、内容を更新しました。
あるタイミングからの経過時間が分かれば、タイマーを表示したり、残り時間が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つのノードンで実現できるのに、当初は色々な思い込みで複雑なプログラムを作ってしまいました。
一応、当初のプログラムの説明も残しておきます。
完成図
このサンプルプログラムでは、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から変わったしゅんかんノードンを使おう。
ディスカッション
コメント一覧
まだ、コメントがありません