Section 3.9 タイマー

今回は新しいクラスを使ってみるね。
どんなクラス?
Timer クラス だよ。
タイマー…って、時間が経つとアラームが鳴ったりする、あのタイマーのこと?
そ、そのタイマー。
でも別にアラームが鳴ったりするわけじゃなくて、時間が経つとイベントが起こるの。
へぇ、そういうのもイベントなんだ。
うん。Timer クラスには onTimer っていうメソッドがあって、 タイマーにセットした時間が経過すると呼び出されるんだ。
それってどんな時に使うの?
一定時間ごとに情報を更新したい時とかだね。
じゃ、タイマーを使った簡単なスクリプトを書いてみるね。
うん。

<タイマーの使用例>

class MyWindow extends Window
{
    var timer;  // タイマーオブジェクト

    // コンストラクタ
    function MyWindow()
    {
        super.Window();

        timer = new Timer(this"action");  // タイマーオブジェクトを作ります
        add(timer);               // タイマーオブジェクトをウィンドウに管理してもらいます
        timer.interval = 1000;    // イベントの発生間隔を 1000 ミリ秒(=1秒)に設定します
        timer.enabled = true;     // タイマーを有効にします

        visible = true;  // ウィンドウを表示状態にします
    }

    // デストラクタ
    function finalize()
    {
        super.finalize();
    }

    // タイマーイベントを処理するための action メソッド
    function action(ev)
    {
        if(ev.target == timer)
        {
            if(ev.type == "onTimer")
            {
                // タイマーイベントが発生するたびに、タイトルバーの現在時刻表示を更新します
                var d = new Date();
                caption = "%d:%02d:%02d".sprintf(d.getHours(), d.getMinutes(), d.getSeconds());
            }
        }
    }
}

var win = new MyWindow();  // ウィンドウを作ります

じゃ、実行してみて。
はーい。

<実行結果(実際には時計が動きます)>

実行の結果表示されたウィンドウ

あっ、タイトルバーの部分が時計になってる!
こんなふうに時計を動かしたりするのにもタイマーが使えるんだ。
じゃあ、タイマーを使えば§3.6で作った時計が動かせるんだよね?
うん、もちろん。
でも、その前にスクリプトをチェックしとこ。
あ、そだね。
まずはコンストラクタから。
Timer クラスのオブジェクトを作る時には、コンストラクタに引数を2つ指定するんだ。
第1引数が this で、第2引数が "action" になってるね。
この "action" って、もしかして前回action メソッドのこと?
ん、そうだよ。ちなみに第1引数は action メソッドが呼び出されるオブジェクト。
このスクリプトだと this になってるから、MyWindow クラスの action メソッドが呼び出されるってこと。
なるほどね。
コンストラクタに指定する引数を変えると、別のメソッドを呼び出すようにすることもできるんだけど、 ここでは説明はパスするね。
詳しくは吉里吉里2リファレンスの『Timer クラス』の項目を参照してね。
は〜い。
あと、第2引数はデフォルトが "action" になってるから、この場合は省略しても OK だよ。
あ、そうなんだ。
で、最初に設定してる interval っていうプロパティは、タイマーイベントの発生周期なんだ。
タイマーイベントの発生周期って?
タイマーイベントは1回起こったらそれで終わりってわけじゃなくて、タイマーを止めたりしない限りは、 設定した時間が経つごとに起こるんだ。
つまり、ここでは interval1000 に設定してるから、 1秒ごとにタイマーイベントが起きるってこと。
そっか、だから周期っていうんだね。
あ、でも何で interval1000 にすると周期が1秒になるの?
タイマーの周期は細かく設定できるように、ミリ秒単位になってるからだよ。
えっと、ミリ秒って確か1秒の1000分の1なんだよね?
そ。よく知ってるね。
trans タグの time 属性とかがミリ秒単位になってるからね〜。
あー、そういえば kag でもミリ秒って結構使われてたね。
うん。
タイマーの周期も同じように設定できるんだね。
ん、そういうこと。
で、もう一つの enabled っていうのは、タイマーのスイッチみたいなもので、 true だとタイマーがオンになってて、false だとタイマーがオフになってるってこと。
ってことは、enabledtrue になってないと、タイマーイベントは発生しないってこと?
そういうこと。
じゃ、次は action メソッド の方を見てみるね。
今回はタイマーのイベントを処理するから、ev.target がメンバ変数の timer になってるかをチェックしてるんだね。
そ。で、タイマーにセットした時間が経過すると Timer クラスの onTimer メソッドが呼び出されるから、 ev.type"onTimer" になってるんだ。
タイマーイベントが起きると、sprintf メソッドを使って、タイトルバーに今の時間を表示するんだね。
ん、そう。
sprintf メソッドの使い方は §3.6 参照ね。
えっと、interval プロパティを 1000 に設定してるから、 1秒に1回タイトルバーを書き換えることになるんだよね?
うん、そういうこと。
タイマーの使い方はわかりやすいでしょ。
そうだね。これならすぐ使えるようになれそう。
あ、タイマーを止めたい時ってどうすればいいの?
enabled プロパティを false にすればタイマーは止まって、 その後イベントは起こらなくなるよ。
あ、そっか。enabled プロパティってタイマーのスイッチみたいなものなんだもんね。
それじゃ、これでタイマーのことは解ったと思うから、 次回はタイマーを使って、§3.6で作った時計を動かしてみよ。
うん、りょーかい!
じゃあ、今回はここまで。
また次回ね!


前へ | TOP | 次へ