ms単位で時刻を取得したい
時計を制作する際、second()単位までは細かく時刻を取得することができません。というのも millis() 関数はプログラムを実行してからの経過時間[ms]を示しているので、時刻を示すmsとしてそのまま扱うことができません。そこでこのページではより細かな時間[ms]を取得するための機能を自作します。様々な方法が考えられますがここではクラスを利用して実装します。ClockMillisというクラスを作り、その中のメソッド関数としてget()を呼び出すことで、second()よりも細かな時刻[ms]を取得したいと思います。とは言っても短い記述で終わるので、直接プログラム中にコメントを入れて紹介するだけにしておきます。
// [ms]単位で時刻を取得するためのクラス
class ClockMillis
{
// コンストラクタ(初期化関数、クラス名と同じ関数で記述すればよい)
ClockMillis() {
previous_second = second(); // 現在の時刻[s]の値を保存しておく
timestamp = millis(); // 現在の時刻[ms]の値を保存しておく
}
// 時刻[ms]を取得する関数
int get() {
// もし現在時刻[s]が最後に保存された時刻[s]とことなる場合(一秒経過した場合)
if ( second() != previous_second ) {
previous_second = second(); // 現在の時刻[s]を保存しておく
timestamp = millis(); // 現在の実行経過時間[ms]を保存しておく
}
// timestampはsecond()の値が変わるたびにそのタイミングでのmillis()を値を保存しているため、
// millis()-timestamp を計算することで時刻[ms]を計測できる
return (millis()-timestamp);
}
// クラス内で使用可能な変数(メンバ変数)の宣言
int previous_second;
int timestamp;
}
ClockMillis clock_millis;
void setup() {
size(500, 500);
textAlign(CENTER);
clock_millis = new ClockMillis();
}
void draw()
{
background(0);
text(nf(hour(), 2)+":"+nf(minute(), 2)+":"+nf(second(), 2), width/2, height/2);
text(nf(clock_millis.get(),4), width/2, height/2 + 20);
}