Feel Physics Backyard

HoloLensの出張授業をする会社で、教材を開発しています

100314-Ruby/Miyakoでストップウォッチを作ってみた

MiyakoというRubyのゲーム作成用フレームワークを、最近友人と勉強している。書籍がマイコミから出ており、それを見ながら二人であれこれとコードを打ち込んでいる。Miyakoはかなり敷居を低くしてくれているので、なかなか面白い。

以下はストップウォッチを作ってみたもの。スペースキーを押すと針が動き始め、もう一度押すと針が止まって計測した時間が表示される。

まあはっきり言って地味なのだが、まだ始めたばかりということでご容赦を。そして、上のプログラムのソースが、以下のものである。

require 'miyako'
include Miyako
include Math

# 60秒の制限時間を実現するWaitCounterクラス。こんなのがいっぱい笑
timer = WaitCounter.new(60)
f = Font.sans_serif
s = "push SPACE key to start"

# 基本的に以下のmain_loopを回し続ける。
Miyako.main_loop do
  # ESCキーなどを押すと終了する
  break if Input.quit_or_escape?

  # スペースキーが押されたら・・・
  if Input.pushed_any?(:spc)
    # タイマーが動いているなら止める
    if timer.executing?
      timer.stop
      s = ((60000 - timer.remain) / 1000.0).to_s + " seconds"
    # さもなくばスタートさせる
    else
      timer.start
      s = "measuring..."
    end
  end

  # 残り時間が60000->0のときdは0->2PI
  d = 2 * PI * (60000 - timer.remain) / 60000.0
  # メインの針を描画する
  Drawing.line(Screen, [320, 180, 120 * sin(d), -120 * cos(d)], [255, 0, 0])

  # 秒目盛りを描画する
  for i in 1..60
    d = 2 * PI * i / 60
    Drawing.line(Screen, [320 + (110 * sin(d)), 180 + (110 * cos(d)),
          10 * sin(d), 10 * cos(d)], [0, 0, 255])
  end

  # 5秒おきの目盛りを描画する
  for i in 1..12
    d = 2 * PI * i / 12
    Drawing.line(Screen, [320 + (110 * sin(d)), 180 + (110 * cos(d)),
          10 * sin(d), 10 * cos(d)], [0, 255, 0])
  end

  # タイマーの外周の円を描画する
  Drawing.circle(Screen, [320, 180], 120, [0, 0, 255])
  # 文字列を描画する
  f.draw_text(Screen, s, 240, 400)
end

Miyako自体も面白いが、気心知れた友人といっしょにワイワイ作るのが楽しい。日曜プログラマーとしてはかなり充実できた。みなさんも気が向いたら声かけて下さいな。