Flashゲーム講座 & アクションスクリプトサンプル集

 

一定時間経過後に、任意の関数を実行する(Flash 8 以降)

 


■一定時間経過後に、任意の関数を実行する


一定時間経過後に、任意の関数を1回だけ実行するには、setTimeout() 関数を使用します。
 
この関数は非同期実行です。
 
すぐに制御が返り、プログラムは動き続けます。
 
中止したい場合は、clearTimeout() 関数を使用します。
 
setTimeout( 関数 , 時間 , データ ... ) :Number
第01引数 Function実行したいコールバック関数を指定。
第02引数 Numberコールバック関数を実行するまでに待機する時間を指定(単位:ミリ秒)
可変引数(略可)*コールバック関数の引数に、任意のデータを渡したい場合に指定。
戻り値 Numberハンドル値が得られる。
 
■第02引数(待機する時間)
 
コールバック関数が実行されるまでに、待機する時間をミリ秒で指定します。
 
必ずしも、指定した時間経過後に実行されるとは限りません。
 
例えば、Flash Player が隠れている場合、最短でも約 125 ミリ秒後に実行されます。
 
省電力化(スロットル)については、こちらで解説しています。(ActionScript3.0)
 
また、Flash Player 10.1 以降から、タイマー周波数の上限が、約 60 fps になりました。
 
よって、約 16 ミリ秒が最短となります。
 
公式リファレンスでは、20 ミリ秒未満の指定は、非推奨となっています。
 
■使用例
 
5000 ミリ秒経過後に,関数を実行する

// ------------------------------------------------------------
// 一定時間経過後に実行される関数
// ------------------------------------------------------------
function TimeoutFunc(){
	trace("実行された");
}

// ------------------------------------------------------------
// 5000 ミリ秒経過後に、関数を実行する
// ------------------------------------------------------------
var timeout_id = setTimeout(TimeoutFunc , 5000);
 
第03引数の動作を確認する

// ------------------------------------------------------------
// 一定時間経過後に実行される関数
// ------------------------------------------------------------
function TimeoutFunc(argument1,argument2,argument3){

	// 出力テスト
	trace(argument1); // false
	trace(argument2); // 123
	trace(argument3); // "あいう"
	trace(arguments);
}

// ------------------------------------------------------------
// 1000 ミリ秒経過後に、関数を実行する
// ------------------------------------------------------------
var timeout_id = setTimeout(TimeoutFunc , 1000 , false , 123 , "あいう");
 

■setTimeout() 関数の動作をキャンセルする

 
setTimeout() 関数の動作をキャンセルするには、clearTimeout() 関数を使用します。
 
clearTimeout( ハンドル値 ) :Void
第01引数 NumbersetTimeout() 関数で得られたハンドル値を指定。
戻り値 Voidなし。
 
setTimeout() 関数のタイマー動作をキャンセルする

// ------------------------------------------------------------
// 変数
// ------------------------------------------------------------
var timeout_id = null;

// ------------------------------------------------------------
// 5000 ミリ秒経過後に、関数を実行する
// ------------------------------------------------------------
timeout_id = setTimeout(function (){

	trace("実行された");

} , 5000);

// ------------------------------------------------------------
// タイマーを停止する
// ------------------------------------------------------------
if(timeout_id !== null){

	// setTimeout() 関数の動作をキャンセルする
	clearTimeout(timeout_id);

	timeout_id = null;
}
 


 

一定の時間間隔で、任意の関数を実行する(Flash 6 以降)

 


■一定の時間間隔で、任意の関数を実行する


一定の時間間隔で、任意の関数を繰り返し実行するには、setInterval() 関数を使用します。
 
この関数は非同期実行です。
 
すぐに制御が返り、プログラムは動き続けます。
 
中止したい場合は、clearInterval() 関数を使用します。
 
setInterval( 関数 , 時間隔 , データ ... ) :Number
第01引数 Function実行したいコールバック関数を指定。
第02引数 Number関数を繰り返し実行するための時間隔を指定。(単位:ミリ秒)
可変引数(略可)*コールバック関数の引数に、任意のデータを渡したい場合に指定。
戻り値 Numberハンドル値が得られる。
 
setInterval( オブジェクト , "メソッド名" , 時間隔 , データ ... ) :Number
第01引数 Objectオブジェクトを指定。
第02引数 String実行したいメソッドの名前を指定。(メソッドはオブジェクトに組み込む)
第03引数 Number関数を繰り返し実行するための時間隔を指定。(単位:ミリ秒)
可変引数(略可)*コールバック関数の引数に、任意のデータを渡したい場合に指定。
戻り値 Numberハンドル値が得られる。
 
■実行タイミングについて
 
必ずしも、指定した時間隔で実行されるとは限りません。
 
例えば、Flash Player が隠れている場合、レートは、約 2 ~ 8 fps まで低下します。
 
省電力化(スロットル)については、こちらで解説しています。(ActionScript3.0)
 
また、Flash Player 10.1 以降から、タイマー周波数の上限が、約 60 fps になりました。
 
よって、約 16 ミリ秒が最短となります。
 
公式リファレンスでは、20 ミリ秒未満の指定は、非推奨となっています。
 
■使用例
 
5000 ミリ秒の時間隔で関数を実行する

// ------------------------------------------------------------
// 一定時間隔で、繰り返し実行される関数
// ------------------------------------------------------------
function IntervalFunc(){
	trace("実行された");
}

// ------------------------------------------------------------
// 5000 ミリ秒の時間隔で関数を実行する
// ------------------------------------------------------------
var interval_id = setInterval(IntervalFunc , 5000);
 
1000 ミリ秒の時間隔でメソッドを実行する

// ------------------------------------------------------------
// MyFunc コンストラクタ
// ------------------------------------------------------------
function MyFunc (){

	// ------------------------------------------------------------
	// ローカル変数を宣言(プライベートな変数)
	// ------------------------------------------------------------
	var count = 0;

	// ------------------------------------------------------------
	// 公開メソッド
	// ------------------------------------------------------------
	this.execute = function(){

		trace("実行された:" + count);
		count ++;
	};
}

// ------------------------------------------------------------
// MyFunc オブジェクトを作成する
// ------------------------------------------------------------
var obj = new MyFunc();

// ------------------------------------------------------------
// 1000 ミリ秒の時間隔でメソッドを実行する
// ------------------------------------------------------------
var interval_id = setInterval(obj , "execute" , 1000);
 
可変引数の動作を確認する

// ------------------------------------------------------------
// 一定時間経過後に実行される関数
// ------------------------------------------------------------
function IntervalFunc(argument1,argument2,argument3){

	// 出力テスト
	trace(argument1); // false
	trace(argument2); // 123
	trace(argument3); // "あいう"
	trace(arguments);
}

// ------------------------------------------------------------
// 1000 ミリ秒経過後に、関数を実行する
// ------------------------------------------------------------
var interval_id = setInterval(IntervalFunc , 1000 , false , 123 , "あいう");
 

■setInterval() 関数の動作をキャンセルする

 
setInterval() 関数の動作をキャンセルするには、clearInterval() 関数を使用します。
 
clearInterval( ハンドル値 ) :Void
第01引数 NumbersetInterval() 関数で得られたハンドル値を指定。
戻り値 Voidなし。
 
setInterval() 関数のタイマー動作をキャンセルする

// ------------------------------------------------------------
// 変数
// ------------------------------------------------------------
var interval_id = null;

// ------------------------------------------------------------
// 5000 ミリ秒の時間隔で関数を実行する
// ------------------------------------------------------------
interval_id = setInterval(function (){

	trace("実行された");

} , 5000);

// ------------------------------------------------------------
// タイマーを停止する
// ------------------------------------------------------------
if(interval_id !== null){

	// setInterval() 関数の動作をキャンセルする
	clearInterval(interval_id);

	interval_id = null;
}
 

■setInterval() 関数の再描画について

 
setInterval() 関数の実行タイミングは、フレームレートの更新間隔とは異なります。
 
再描画が発生しない事に注意して下さい
 
例えば、コールバック関数内から、ムービークリップを操作してもすぐに画面に反映されません。
 
実際の描画は、次のフレームの更新タイミングで行われます。
 
手動的に再描画したい場合は、updateAfterEvent() 関数を使用します。
 
ムービークリップ mc を円のように移動させる

// ------------------------------------------------------------
// 初期化
// ------------------------------------------------------------
var px = 200;		// 円の中心 x 座標
var py = 150;		// 円の中心 y 座標
var rot = 0;		// 円の角度(0 ~ 360)
var rot_speed = 1;	// 円の角度変化量(0 ~ 360)
var radius = 30;	// 円の半径


// ------------------------------------------------------------
// 0 ミリ秒の時間隔で関数を実行する
// ------------------------------------------------------------
setInterval(function (){
	// 角度を変化させる
	rot += rot_speed;

	// 角度からラジアンに返還する
	var rad = rot * Math.PI / 180;

	var x = px + Math.cos(rad) * radius;
	var y = py + Math.sin(rad) * radius;

	// 座標をインスタンスの座標に反映
	mc._x = x;
	mc._y = y;

	// 再描画を行う
	updateAfterEvent();
} , 0);
 


 

フレーム更新時に、任意の関数を実行する

 
 


■エンターフレームイベントについて


エンターフレームイベントを使用すると、Flash Player に設定したフレームレートの時間隔で、任意の関数を実行する事ができます。
 
エンタフレームイベントの発火のタイミングは、フレームの更新と一致します。
 
すなわち、Flash Player の再描画タイミングと一致します。
 
ムービークリップの制御や、描画に関する処理は、エンターフレームイベント内で処理した方が効率がいいでしょう。
 
Flash Player の再描画タイミングを、動的に増やしたい場合は、setInterval() 関数を駆使すると実現できます。
 

■ onClipEvent ハンドラの enterFrame イベント


毎フレームごとに、任意の関数を繰り返し実行するには、onClipEvent ハンドラの enterFrame イベントを使用します。
 
タイムラインに配置した、任意のムービークリップを選択してから、スクリプトを記述します。
 
毎フレームごとに、繰り返し実行されるイベント

// ------------------------------------------------------------
// 毎フレームごとに、繰り返し実行されるイベント
// ------------------------------------------------------------
onClipEvent (enterFrame) {

	trace("実行された");

}
 

■ MovieClip クラスの onEnterFrame イベント (Flash 6 以降)


毎フレームごとに、任意の関数を繰り返し実行するには、onEnterFrame イベントを使用します。
 
onEnterFrame イベントハンドラは、MovieClip にのみ存在します。
 
毎フレームごとに、繰り返し実行されるイベント (Flash 6 以降)

// ------------------------------------------------------------
// 空のムービークリップを作成する
// ------------------------------------------------------------
var mc = _root.createEmptyMovieClip("empty",0);

// ------------------------------------------------------------
// 毎フレームごとに、繰り返し実行されるイベント
// ------------------------------------------------------------
mc.onEnterFrame = function () {

	trace("実行された");

};
 
■イベントのリッスンを終了する
 
イベントのリッスンを終了するには、null 値をセットします。
 
イベントハンドラのリッスンを止める (Flash 6 以降)

// ------------------------------------------------------------
// 空のムービークリップを作成する
// ------------------------------------------------------------
var mc = _root.createEmptyMovieClip("empty",0);

// ------------------------------------------------------------
// 毎フレームごとに、繰り返し実行されるイベント
// ------------------------------------------------------------
mc.onEnterFrame = function () {

	trace("実行された");

};

// ------------------------------------------------------------
// onEnterFrame イベントのリッスンを止める
// ------------------------------------------------------------
mc.onEnterFrame = null;