|
Startボタン・Stopボタン 兼用の Flashストップウォッチ です。
サンプル作成に使用した ParaDraw のバージョンは Ver.0.3a4, Suzuka のバージョンは Ver. 0.8.0.0[RichEdit版] です。
タイマーなどを作成する場合,普通は ActionScript の getTimer() 関数を使用します。
ゲームなどで時間制限を付ける場合も,この getTimer() を使用するのが普通です。
setInterval を利用してもできなくはありませんが,実は setInterval はかなりの誤差があって,タイマーなどとしてはあまり使用できません。
また,onClipEvent(enterFrame) {} や MovieClip.onEnterFrame = function() {} など onEnterFrame系 で,カウントを加算して行く方法も考えられなくもありませんが,フレームレートは常に変わりますし,再生するPCによっても変わりますから,これも全く使えたものではありません。
getTimer() で得られる戻り値は,Flash の SWF ファイルが再生し始めてからの経過時間(ミリ秒単位)です。
この値を onEnterFrame系 などで得て,色々な処理をします。
onEnterFrame系 自体は大変不安定で,実行時間はあてにはなりません。
しかし,その不安定な実行時点で得られる時間自体は,かなり正確なのでタイマーとして使えます。また得られる値は フレームレート にも依存しません。
サンプルファイルのインスタンス階層構造は次のようになっています。
_root
├ cnt_txt(ダイナミックテキストフィールド)
├ start_stop_btn(スタート/ストップ ボタン)
└ reset_btn(リセットボタン)
そして,メインのタイムラインの フレーム1 には次のスクリプトを書いています。
// スタートフラグ start_flg の初期化(初期値 false)
start_flg = false;
// テキスト表示の初期化
cnt_txt.text = "0.000";
// 時間カウント用の変数cnt_num の初期化
cnt_num = 0;
// 時間計測用ユーザ定義関数 countUp の定義
function countUp() {
// 1フレーム進む時間毎に随時実行
_root.onEnterFrame = function() {
// カウントの算出(単位:ミリ秒)
cnt_num = getTimer()-memo_num;
// テキストの表示(単位:秒)
cnt_txt.text = cnt_num/1000;
};
}
// スタート/ストップ ボタン押下時の動作定義
_root.start_stop_btn.onPress = function() {
// start_flg が false であれば
if (!start_flg) {
// その時の時間とカウントの差を記録
memo_num = getTimer()-cnt_num;
// ユーザ定義関数 countUp の実行
countUp();
} else {
// _root の onEnterFrame を削除
delete _root.onEnterFrame;
}
// start_flg の true/false を逆にする
start_flg = !start_flg;
};
// リセット ボタン押下時の動作定義
_root.reset_btn.onPress = function() {
// _root の onEnterFrame を削除
delete _root.onEnterFrame;
// カウントを初期化
cnt_num = 0;
// テキスト表示の初期化
cnt_txt.text = "0.000";
// start_flg を false にする
start_flg = false;
};
|
上述の通り getTimer() で得られる値は SWF ファイルを再生し始めてからの経過時間です。
したがって,「ある時点A」から「ある時点B」までの間の時間を計測する場合は,
とりあえず「ある時点A」での時間を取得しておいて,「ある時点B」で得た時間から「ある時点A」での時間を引いてやって,その間の経過時間を求めます。
式で書くと次のようになります。
時点A〜時点Bの間の時間 = 時点Bの時間−時点Aの時間
時間を実際に代入した場合のイメージ図は次のようになります。

この部分を,時と場合によって考え直すのが難しいと言えば難しいですが,単なるちょっとややこしい算数(引き算)ですから,よく考えれば色々な場合で,同様にできると思います。
あと,
たまに「時間」と「時刻」とを混同される方がいらっやいますが,getTimer() で得られる値は SWF ファイルを再生し始めてからの経過時間です。時刻ではありませんので混同しないように注意してください。
すごく長い時間動作させる場合は,Dateクラス のメソッドで時刻から時間を算出した方が得られる時間が正確な場合もありますが,それも面倒ですから,普通は時間計測には getTimer() を使います。
また,1つのボタンを「スタートボタン」と「ストップボタン」のように兼用するような場合は,
上のようにフラグとなる変数を作成して,そのフラグの値によって動作を振りわければ,1つのボタンで違う動作をさせることができます。
|