つらねの日記

プログラムの進捗やゲームをプレイした感想などを書き連ねる日記。

タイマー

前書き

一時期フリーダムウォーズにはまっていたことがある。
その際、アイテムを生成するために現実世界での時間がかかった。
その時間を計測するためだけにタイマーを作った。
個人的には中々描画が気に入っている。

import ddf.minim.*;

import java.util.Calendar;
import java.awt.Rectangle;

long starting_time=0;

int time=5*60*1000;
int time_is_up=0;

Rectangle cage;
AudioSample as;

void setup() {
  size(300, 150);
  textAlign(CENTER);
  cage=new Rectangle(10, height/2-10, width-20, 20);
  as=new Minim(this).loadSample("alarm.wav");

  mouseReleased();
  frame.setTitle("Plant Timer 5");
  frame.setIconImage(loadImage("icon.png").getImage());
}

void draw() {
  background(255);
  long t=Calendar.getInstance().getTimeInMillis()-starting_time;
  float f=t/(float)time;
  float w=(cage.width-2)*f;
  if (f>=1)time_is_up++;
  if (time_is_up!=0) {
    if (time_is_up==1){
      frame.toFront();
      as.trigger();
    }
    float d=55*cos(radians(time_is_up));
    background(200+min(d, 0), 200+min(d, 0), 200+d);
    w=(width-22);
    fill(0);
    text("work done.", width/2, cage.height-5);
  } else {
    fill(0);
    text(((time-t)/1000/60)+" m "+nf((time-t)/1000%60, 2, 0)+" s ", width/2, cage.height-5);
  }

  fill(0);
  rect(cage.x, cage.y, cage.width, cage.height);
  fill(#aaffaa);
  rect(cage.x+1, cage.y+1, w, cage.height-2);

  if (mousePressed&&cage.contains(mouseX, mouseY)) {
    f=float(mouseX-cage.x)/cage.width;
    starting_time=t+starting_time-(long)(time*f);
    time_is_up=0;
  }
}

void mouseReleased() {
  if (!cage.contains(mouseX, mouseY)) {
    starting_time=Calendar.getInstance().getTimeInMillis();
    time_is_up=0;
  }
}

あとがき

まったくもって固定された5分という時間をはかることしかできないので、他の用途には使い難くはあるのだが、リセットと大体の時間を後付設定が容易に行えるという点においては当時は愛用した。java.util.Calendarを用いてタイマーを作ったことはなかったと思ったので少しはいい勉強にもなったのではないだろうか。