2012年7月11日水曜日

[ドリトル] Timerを使う

タイマーを使ってみよう。
タイマーで定期的な実行ができる。動きが見えるようにゆっくり動かす時に使う。
aTimer ! [ブロック] execute. であらかじめ指定したインターバルで指定回数(または指定時間)実行を繰り返すことができる。

周回する Turtle の速さを Slider で変えてみよう。
Slider を動かすとそれで周回する Turtle の速さを変える。

t1 = Turtle ! create penup 150 back pendown.
slider1 = Slider ! create.
label1 = Label ! (slider1!value?) create.
timer1 = Timer ! create.

slider1:action = [ 
  label1 ! ( self ! value?) set. 
  timer1 ! (0.1 * ( self ! value?) / 50) interval.
].

timer1 ! 0.1 interval 360 times.
timer1 ! [
  t1 ! 10 leftturn 15 forward.] execute.
スピードが変わらない。
一度実行を開始したタイマーは、そのインターバルを変えても変わらないようだ。
一度停止してから再度 execute をかけてみよう。

...
slider1:action = [ 
  label1 ! ( self ! value?) set. 
  timer1 ! stop.
  timer1 ! (0.1 * ( self ! value?) / 50) interval 360 times.
  timer1 ! [
    t1 ! 10 leftturn 15 forward.] execute.
].

timer1 ! [
  t1 ! 10 leftturn 15 forward.] execute.

止まってしまった。もう動かない。
一度停止したタイマーは復活しないということか。

仕方がないのでTimerを作り直すことにする。

t1 = Turtle ! create penup 150 back pendown.
slider1 = Slider ! create.
label1 = Label ! (slider1!value?) create.
timer1 = Timer ! create.
timer1 ! 0.1 interval 360 times.

slider1:action = [ 
  label1 ! ( self ! value?) set. 
  timer1 ! stop.
  timer1 = Timer ! create.
  timer1 ! (0.1 * ( self ! value?) / 50) interval 360 times.
  timer1 ! [
    t1 ! 10 leftturn 15 forward.] execute.
].

timer1 ! [
  t1 ! 10 leftturn 15 forward.] execute.

なんかいまいちなコードになったが、一応期待通りには動くようになった。
一度動き出したタイマーの間隔を変えるには作り直すしかないようだ。

使い方を間違えているのかもしれないが、基本的には間隔は一定にしておいて定期的に実行するイベント内で調整をするべきなのだろうか。


0 件のコメント:

コメントを投稿