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



FPSとは?

 
 


 

■FPS(フレームパーセコンド)とは?

FPSとは Frame Per Second (フレーム・パー・セコンド)の略で、1秒あたりに実際に画面を更新している回数を表します。

フレームレートで設定した値で必ずしもFlashの画面が更新されるとは限りません。例えば、Flashで絵をたくさん表示しすぎたときなんかはどうしても処理落ちして描画に遅延が発生してしまいます。 処理落ちするとゲームの操作ももっさりとするのでなるべく無くしたいものです。

そこでフレームレート値と比較して、どれだけ処理落ちしているのかを調べます。


フレームレートの値に近い → 処理が軽い
ゼロに近い → 処理が重過ぎる
 

 




FPS(フレームパーセコンド)を計算する

 

サンプルをダウンロード
 


 
■考え方

まず、毎フレーム1ずつ値をカウントします。このカウントは描画回数を表します。


onClipEvent (load) {
	time_count = 0;
}
onClipEvent (enterFrame) {
	time_count += 1;
}
 
2秒間で58回カウントできたとします。 FPSとは1秒間に何回画面が更新できたかという値なので、以下の比が成り立ちます。

 2秒 : 58回 = 1秒 : ?回

よってこの2秒間のフレームレートは 29 であることがわかります。


onClipEvent (load) {
	time_count = 0;
	old_timer = getTimer();
}
onClipEvent (enterFrame) {

	time_count += 1;
	if ((getTimer()-old_timer) / 1000 >= 2.0) {
		fps = time_count / 2;
		old_timer = getTimer();
		time_count = 0;
	}	
}
 
■実装例


onClipEvent (load) {
	fr = 60;	// フレームレートによって変更してください
	time = 1000;	// 表示が変わる時間(ミリ秒)
	time_count = 0;
	old_timer = getTimer();
	fps = fr+'/'+fr;
}
onClipEvent (enterFrame) {

	time_count += 1;
	if (getTimer()-old_timer >= time) {
		fps = Math.floor(time_count*1000/
(getTimer()-old_timer))+'/'+fr; old_timer = getTimer(); time_count = 0; } }

 




フレームレートを変更する(Flash 6 以降)

 

サンプルをダウンロード
 


 
1.フレームレートを変更する

フレームレートを変更するといってもはじめに設定したFlashのフレームレートを変更することはできません。 setInterval 関数を使ってFlash上で別のフレームレートのムービークリップを混在させます。

 
2.setInterval関数とは?

setInterval 関数を使うとFlashで設定したフレームレートのタイミングではなく、自分で指定した秒間で関数を実行することができます。

setInterval(関数名, 数値);

第一引数は関数名または匿名関数の参照。
第二引数は呼び出される関数の時間隔 (ミリ秒)。
 
この関数を使って、ムービークリップを座標上で動かしてみます。

 
3.ユーザー関数を作る

ムービークリップ meme をx方向に動かす関数 MyFunc を作ります。

function MyFunc(){

	// ムービークリップをx方向に移動
	_root.meme._x += 1;

}
 
 
4.setInterval関数で時間隔を設定

関数 MyFunc が実行されるタイミングをsetInterval関数で設定します。

function MyFunc(){

	// ムービークリップをx方向に移動
	_root.meme._x += 1;
		
}

setInterval(MyFunc , 100);

 
これで、Flashのフレームレートとは関係なく指定した時間隔でムービークリップが動き出します。 だだしFlashのフレームレートより指定した時間隔の方が早い場合は、画面が更新されないため、updateAfterEvent関数を呼び出して画面を更新します。

function MyFunc(){

	// ムービークリップをx方向に移動
	_root.meme._x += 1;
	
	// 画面を更新
	updateAfterEvent();
			
}

setInterval(MyFunc , 100);
 
次にムービークリップを再生してみます。

 
5.設定した時間隔で再生する

ムービークリップを自分で設定した時間隔で再生するには、ユーザー関数内で再生ヘッドをひとつ動かしてから画面を更新します。

function MyFunc(){

	// 再生ヘッドをひとつ進める
	_root.meme.gotoAndStop(_root.meme._currentframe + 1);
	
	// 画面を更新する
	updateAfterEvent();
	
}

setInterval(MyFunc , 100);

 
 
6.設定した時間隔呼び出しを解除する

clearInterval( ); 設定した時間隔呼び出しを解除するには、clearInterval関数を使います。 setInterval関数を実行したときに戻り値として、ID番号が返ってきます。それを、変数に退避させておきます。 解除したいときに、clearInterval関数に引数として指定します。

function MyFunc(){
	
}

// 番号を保存
var intervalID = setInterval(MyFunc , 100);

 


// 解除
clearInterval( intervalID );

 
 
7.Interval関数の注意点

Flashのフレームレートが小さすぎると指定した時間隔を正確に呼び出すことができません。

Flashの1フレームレートは 約 1 秒 = 1000 ミリ秒 です。

Flashのフレームレートの上限は 120FPS ですがInterval関数を使うと、この制限を越えることができます。数値だけなら 1000FPS くらい出るようです。


サンプルをダウンロード
 

 




音に合せて映像の同期を取る

 

サンプルをダウンロード
 


 
このサンプルでは、あらかじめ無音でストリミング再生しているムービークリップを用意して、そのムービークリップをFlashに表示したり消したりする事により 音に合せて映像の同期を合わせるかを実現しています。
 
 
1.ストリミング再生を使っているMCを用意する
 
無音の素材を用意します。WAVでもいいですが、書き出すときの負担にならないようにあらかじめ、8kbps 11,025HZでエンコードしたMP3を用意した方がいいでしょう。 その素材をムービークリップにストリミング再生で貼り付けます。MCは、ムービークリップの最後から1フレーム目に戻ってループ再生し続けるようにします。 MCの長さですが、最後のフレームから1フレーム目に戻るときに少しだけ同期が乱れます。ですので最低でも10秒くらいはあった方がいいと思います。 ライブラリにあるMCにカーソルを合わせてリンケージを選択してリンケージプロパティで名前を付けます。詳しくはこちらを参照してください。
 
2.MCを画面に配置する
 
例1)リンケージプロパティで名前を付けた douki というMCを複製する。

	_root.attachMovie( "douki", "douki", 0 );

 
3.MCを画面から削除する

例)_rootにあるMC"douki"を削除する。

	_root.douki.removeMovieClip();