Flashゲームプログラミング講座 for ActionScript3.0

 

変数をプリントデバッグする

 
サンプルをダウンロード
 


■変数をプリントデバッグする


変数の中身を出力ウィンドウに表示するには trace() 関数を使用します。引数に数値や文字列をセットします。
 
この関数は書き出しプレビュー時の デバッグ版 Flash Player で動作します。
 
変数 str をプリントデバッグする

var str : String = "表示テスト";
trace(str);
 
 
引数をカンマ , で区切って複数指定する事もできます。
 
以下の例の場合、次のように出力されます。
 
変数を複数指定してプリントデバッグする

var num : Number = 123;
var str : String = "表示テスト";
var ary : Array = ["a","b","c"];

trace (num,str,ary);
 
 

■ trace() 関数を無効化する


trace() 関数を無効化するには、 パブリッシュ設定にある「Traceアクションを省略」にチェックを付けます。
 
 
このチェックが付いている場合、書き出された swf ファイルに trace 関数を呼び出す処理が取り除かれます。
 
リリース用の swf ファイルを書き出す場合は忘れずに付けましょう。
 
 



アクションスクリプト実行にかかる時間を測定する

 
サンプルをダウンロード
 


■実行を開始してからの経過時間を取得する


Flash Player の実行を開始してからの経過時間を取得するには getTimer() 関数を使用します。
 
戻り値に時間(単位:ミリ秒)が返ります。
 
FlashPlayerを実行してから経過時間を知りたい

var time = getTimer();
 

■アクションスクリプト実行にかかる時間を測定する


アクションスクリプトの実行前と実行後との経過時間の差を調べることにより、アクションスクリプトの実行にかかる時間を調べます。
 
単位がミリ秒なので、厳密な時間測定には使えません。測定したい処理を何度か繰り返し実行して時間を稼ぐ必要があります。
 
「他の処理とどちらが高速に動作するか」という比較に使用できます。
 
アクションスクリプトを実行するのにかかる時間を調べる

var old_time = getTimer();	// 実行前に測定


// 負荷を調べたい一連の処理 ----------
var i;
var ary = new Array();
for(i=0;i<1000000;i++){
	ary[i] = i;
}
// 負荷を調べたい一連の処理 ----------


var time = getTimer() - old_time;	// 実行後に測定
trace("経過時間:" + time);		// 差
 
 



フレームパーセコンド(FPS)を測定する

 

サンプルをダウンロード
 


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


1秒間あたりに実際に画面を更新している回数を表します。
 
通常、FlashPlayer は設定したフレームレートの回数で画面が更新されます。30 フレームレートを指定した場合は、1 秒間に 30 回更新されます。
 
しかし、アクションスクリプトで処理する命令が多すぎたり描画するものが多すぎる場合、CPUを 100% フル稼働させても間に合わずに遅延が発生することがあります。
 
遅延が発生した場合もっさりした動きになり、ユーザーを不快にさせる事があります。
 
そこで、フレームパーセコンドを調べて、この値がフレームレートとなるべく同じ値になるように Flash を調整すると、快適に閲覧できる環境を作り出すことができます。
 

■フレームパーセコンド(FPS)を測定する


1秒間に画面が何回更新されたかを調べます。

ENTER_FRAME イベントの中で回数をカウントしていきます。これが描画回数となります。
 
そして getTimer() 関数を使って純粋に 1 秒経過した時点のカウント総数がフレームパーセコンドとなります。
 
1秒間で何回画面が更新されたか調べる

var draw_count = 0;          // 描画カウント
var old_timer = getTimer();  // 時間待避


stage.addEventListener(Event.ENTER_FRAME ,function (){
	draw_count += 1;         // 描画回数カウント

	// 1秒経過していれば
	if (getTimer()-old_timer >= 1000) {
		trace(draw_count);	// FPS

		old_timer = getTimer();
		draw_count = 0;
	}
});
 
一定時間ごとにFPSを調べたいときは、比から計算します。
 
例えば 0.5 秒経過時に 30 回測定できた場合は、
 
0.5 秒 : 30 回 = 1 秒 : ?回
 
なのでフレームレートは 30 / 0.5 = 60 FPS となります。
 
0.5秒おきにFPSを測定する

// テキストフィールド
var text_field = new TextField();
text_field.background = true;
text_field.width = 60;
text_field.height = 18;
stage.addChild (text_field);

var update_time = 500;       // 表示が変わる時間(ミリ秒)
var draw_count = 0;          // 描画カウント
var old_timer = getTimer();  // 時間待避


stage.addEventListener(Event.ENTER_FRAME ,function (){
draw_count += 1;
	if (getTimer()-old_timer >= update_time) {
		// 小数第1位まで表示
		var fps = draw_count * 1000 / (getTimer() - old_timer);
		fps = Math.floor(fps * 10) / 10;  

		text_field.text = fps + ' / ' + stage.frameRate;
		old_timer = getTimer();
		draw_count = 0;
	}
});
 
 



アクションスクリプトをテキストエディタで編集する

 
サンプルをダウンロード
 


■アクションスクリプトをテキストエディタで編集する


アクションスクリプトを編集する時は、Flash のアクションパネルで記述しますが、自分が使い慣れているテキストエディタを使って編集したい事があります。
 
そんな時は、アクションスクリプトをテキストファイルにして外部に置いておき、アクションパネル側でそのファイルを取り込むようにすることができます。
 
 

1.アクションスクリプトファイルを作成する


テキストファイルを作成してアクションスクリプトを記述します。
 
テキストファイルの拡張子は *.as にしておきます。これをアクションスクリプトファイルと呼びます。実際はどんな拡張子でもかまいません
 

2.外部にあるアクションスクリプトファイルをインクルードする


ASファイルをアクションパネル側で取り込むためには include 命令文を使用します。
 
include "ファイル名" と記述すると、書き出し時に、アクションスクリプトファイルの中身が読み込まれてコンパイルされ、swf ファイルとして書き出されます。
 
test.as ファイルをインクルードする

include "test.as"
 
また相対パスでファイル名を指定すれば、別のディレクトリにあるアクションスクリプトファイルをインクルードすることもできます。
 
ASファイルの中でさらに別のパスをインクルードした場合は、Flash ファイルからの相対参照ではなくそのASファイルからの相対参照となります。
 
../as/test.as にあるアクションスクリプトファイルをインクルードする

include "../as/test.as"
 

■文字化けが起こる&シンタックスエラーが出る


アクションスクリプトファイルの文字コードがShift-JISだと起こるようです。コメントの位置によってはコンパイルエラーを返します。UTF-8 で保存すると正しくコンパイルできるようです。
 
 



文字列からクラスオブジェクトを取得する

 
サンプルをダウンロード
 


■文字列からクラスオブジェクトを取得する


文字列からクラスをインスタンス化するには、getDefinitionByName() 関数を使用します。
 
引数にクラス名を文字列で指定すると、戻り値からクラスオブジェクトが取得できます。
 
文字列からクラスオブジェクトを取得しインスタンス化する

var str : String = "flash.display.MovieClip";
var class_obj : Object = getDefinitionByName(str);

var mc : MovieClip = new class_obj();
 

■連番のクラス名を一括でインスタンス化する


MyClass0 ~ MyClass99 までの 100 個の自作のクラスをまとめてインスタンス化したい場合の例です。
 
MyClass0 ~ MyClass99 までの100個の自作のクラスをまとめてインスタンス化

var i;
for(i=0;i<100;i++){
	var class_obj : Object = getDefinitionByName("MyClass" + i);
	var instance = new class_obj();
}
 
 



変数の中身の型を文字列で取得する

 
サンプルをダウンロード
 


■変数の中身の型を文字列で取得する


変数の中身の型を調べるには、getQualifiedClassName() 関数を使用します。
 
引数に変数を代入すると、戻り値から変数の型を文字列で取得できます。
 
変数の中身の型を文字列で取得する

var mc : MovieClip = new MovieClip();
var value_name : String = getQualifiedClassName(mc);

trace(value_name);
 
 
 



メモリ使用量を取得する

 


■メモリ使用量を取得する


FlashPlayer のメモリ使用量を取得するには、System.totalMemory プロパティを使用します。
 
メモリ使用量を取得する

trace(System.totalMemory);

// 配列を作成
var a = new Array();
for(var i=0;i<65535;i++){
	a[i] = 0xFFFFFFFF;
}

trace(System.totalMemory);
 
 



ガベージコレクションを実行する

 


■ガベージコレクションとは?


配列やオブジェクトやインスタンスの作成を試みると、メモリから未使用の領域を探し出し空きがあれば確保して使用可能な状態になります。 インスタンスをどんどん作り続けるといずれメモリの空き領域が無くなり、新しく作成する事ができなくなります。
 
そこで、不要になったインスタンスを検出し、メモリから自動的に解放してくれる機能が必要になります。それがガベージコレクションです。 ガベージコレクションがインスタンスを不要と判断する条件は、インスタンスにアクセスできない状態になったときです。
 
インスタンスへの参照を不能にしてガベージコレクションの対象にする

// 配列を確保
var a = new Array();
for(var i=0;i<65535;i++){
	a[i] = 0xFFFFFFFF;
}

// 変数 a に null を代入する
a = null;


// 変数 a から配列にアクセスする方法が失われてしまったので
// 配列がガベージコレクションの対象になる
 
ガベージコレクションは Flash Player が自動的に行います。

プログラマが行うことは、
インスタンスが不要になった場合にそのインスタンスをどこからもアクセスできない状態にして、ガベージコレクションにいずれ回収されるようにします。
 

■強制的にガベージコレクションを実行する


強制的に、ガベージコレクションを実行するには、System.gc() メソッドを使用します。
 
ただし、デバッグ版の FlashPlayer でのみ動作します。
 
Adobe AIR の場合、 ADL と AIR アプリケーションのどちらでも動作します。
 
ガベージコレクションを実行する

var a;
addEventListener(Event.ENTER_FRAME,function (e){
	
	trace(" ----- ")

	// メモリ使用量チェック
	trace(System.totalMemory);

	// 配列を確保
	a = new Array();
	for(var i=0;i<65535;i++){
		a[i] = 0xFFFFFFFF;
	}

	// メモリ使用量チェック
	trace(System.totalMemory);

	// 配列への参照を外す
	a = null;
	
	// ガベージコレクションを実行 (Debug 版プレイヤーか Adobe AIR でのみ動作)
	System.gc();
});