開発に便利な ActionScript について
一度だけ初期化したい(Flash 6 以降)
サンプルをダウンロード
■ムービークリップを1度だけ初期化する
ムービークリップのタイムライン 1 フレーム目にのみ記述できます。
#initclip ~ #endinitclip
…の中に記述されたアクションスクリプトは 1 度実行されると、再生ヘッダが再び 1 フレーム目に移動しても 2 回目以降は実行されません。
変数を作成する
#initclip
var value0 = 0;
var value1 = 0;
var value2 = 0;
#endinitclip
変数をプリントデバッグしたい
サンプルをダウンロード
■変数に格納されたデータを調べる
開発中は、プログラムが意図した通りに動作するか、変数に正しい値が格納されたか気になるところです。
そんなときは、trace() 関数を使用するとお手軽に調べる事ができます。
trace() 関数の引数に変数や文字列をセットすると Adobe Flash の出力パネルに「変数に格納されたデータ」やメッセージを表示する事ができます。
この関数は書き出しプレビュー時の デバッグ版 Flash Player で動作します。
変数の中身を調べる例です。
変数を複数指定してプリントデバッグする
var num = 123;
var str = "表示テスト";
var ary = ["a","b","c"];
trace (num);
trace (str);
trace (ary);
メッセージを表示する例です。
メッセージを表示する
var i = 0;
if(i == 0){
trace ("結果は真です。");
}else{
trace ("結果は偽です。");
}
■ trace() 関数を無効化する
trace() 関数を無効化するには、
パブリッシュ設定にある「Traceアクションを省略」にチェックを付けます。
このチェックが付いている場合、書き出された swf ファイルに trace 関数を呼び出す処理が取り除かれます。
リリース用の swf ファイルを書き出す場合は忘れずに付けましょう。
アクションスクリプトを外部に置きたい
サンプルをダウンロード
■アクションスクリプトを Adobe Flash の外に出してみよう
Adobe Flash 8 以前のアクションスクリプトエディタは、プログラムが長くなるとすぐに重くなりがちです。
そんなときは、アクションスクリプトを外部のテキストファイルに記述することで回避できます。
自分が使い慣れているテキストエディタを使って編集する事ができます。
ただし、Adobe Flash のスクリプトの入力支援が使えなくなるのでアクションスクリプトを組みなれている人向けです。
1.アクションスクリプトファイルを作成する
テキストファイルを作成してアクションスクリプトを記述します。
テキストファイルの拡張子は *.as にしておきます。これをアクションスクリプトファイルと呼びます。実際はどんな拡張子でもかまいません
2.外部にあるアクションスクリプトファイルをインクルードする
ASファイルをアクションパネル側で取り込むためには include 命令文を使用します。
#include "ファイル名" と記述すると、書き出し時に、アクションスクリプトファイルの中身が読み込まれてコンパイルされ、swf ファイルとして書き出されます。
test.as ファイルをインクルードする
#include "test.as"
また相対パスでファイル名を指定すれば、別のディレクトリにあるアクションスクリプトファイルをインクルードすることもできます。
ASファイルの中でさらに別のパスをインクルードした場合は、Flash ファイルからの相対参照となります。
../as/test.as にあるアクションスクリプトファイルをインクルードする
#include "../as/test.as"
データの型を調べる
サンプルをダウンロード
■データの型を調べる
データの型を調べるには、typeof 演算子を使用します。
以下の文字列が得られます。
型 | 得られる文字列 |
ヌル値 (null) | "null" |
未定義 (undefined) | "undefined" |
真偽値 (Boolean) | "boolean" |
数値 (Number) | "number" |
文字列 (String) | "string" |
関数 (Function) | "function" |
ムービークリップ (MovieClip) | "movieclip" |
その他のオブジェクト | "object" |
■オブジェクトの種類の特定について
Boolean、Number、String、Function、MovieClip 型は、判別が可能です。
Array、Object、Button、TextField などのオブジェクトは、すべて "object" 扱いとなり、判別できません。
オブジェクトの種類を特定するには、instanceof 演算子を使用するなどの方法があります。
■ヌル値 (null) について
null 値を調べると、"null" が得られます。
これは、ECMA-262 edition 3 の仕様書とは、異なる動作です。
他の ECMAScript 環境との互換性を考慮する場合は、注意してください。
例えば、ActionScript3.0 や JavaScript などでは、仕様書通りの "object" が得られます。
■記述例
typeof の記述例
// シンプルな構文
var type = typeof 123;
var type = typeof "abc";
// 関数のような構文
var type = typeof(123);
var type = typeof("abc");
各データから得られる文字列を確認する
// ヌル値
var variable = null;
var type = typeof(null);
trace("ヌル値:" + type); // undefined
// 未定義値
var variable = undefined;
var type = typeof(variable);
trace("未定義値:" + type); // undefined
// 真偽値
var variable = true;
var type = typeof(variable);
trace("真偽値:" + type); // boolean
// 数値
var variable = 123;
var type = typeof(variable);
trace("数値:" + type); // number
// 文字列
var variable = "abc";
var type = typeof(variable);
trace("文字列:" + type); // string
// 関数
var variable = function (){};
var type = typeof(variable);
trace("関数:" + type); // function
// ムービークリップ
var variable = _root.createEmptyMovieClip ( "mc" , 0 );
var type = typeof(variable);
trace("MovieClip:" + type); // movieclip
// 配列
var variable = new Array();
var type = typeof(variable);
trace("Array:" + type); // object
// オブジェクト
var variable = new Object();
var type = typeof(variable);
trace("Object:" + type); // object
// テキストフィールド
_root.createTextField ( "tf" , 1 , 0 , 0 , 100 , 20 );
var variable = _root.tf;
var type = typeof(variable);
trace("TextField:" + type); // object
■オブジェクトの種類を特定する(instanceof 演算子)
任意のオブジェクトが、指定したコンストラクタ関数を使ってインスタンス化されたものであるかを調べるには、instanceof 演算子を使用します。
指定したコンストラクタ関数で、実体化されていれば、true が得られます。
instanceof 演算子は、Flash 6 以降から利用できます。
配列オブジェクトであるか調べる (Flash 6 以降)
// 配列を作成
var ary = new Array();
// 配列オブジェクトであるか調べる(Array コンストラクタを使って、実体化されたか調べる)
var result = ary instanceof Array;
// 出力テスト
trace(result); // true
Object オブジェクトであるか調べる (Flash 6 以降)
// Object オブジェクトを作成
var obj = new Object();
// Object オブジェクトであるか調べる(Object コンストラクタを使って、実体化されたか調べる)
var result = obj instanceof Object;
// 出力テスト
trace(result); // true
TextField オブジェクトであるか調べる (Flash 6 以降)
// TextField オブジェクトを作成
_root.createTextField ( "tf" , 1 , 0 , 0 , 100 , 20 );
var text_field = _root.tf;
// TextField オブジェクトであるか調べる(TextField コンストラクタを使って、実体化されたか調べる)
var result = text_field instanceof TextField;
// 出力テスト
trace(result); // true
指定したコンストラクタ関数を使って実体化されたオブジェクトが、プロトタイプチェーン内に存在する場合も true が得られます。
プロトタイプチェーン状態にあるオブジェクトの instanceof 演算子の結果を調べる (Flash 6 以降)
// ------------------------------------------------------------
// プロトタイプチェーン状態にあるコンストラクタ関数を作成
// ------------------------------------------------------------
// コンストラクタ関数A
function FuncA(){
}
// コンストラクタ関数B
function FuncB(){
}
// コンストラクタ関数C
function FuncC(){
}
// 関数Bのプロトタイプに、インスタンスAをセット
FuncB.prototype = new FuncA();
// 関数Cのプロトタイプに、インスタンスBをセット
FuncC.prototype = new FuncB();
// ------------------------------------------------------------
// 実体化テスト
// ------------------------------------------------------------
// インスタンスAを作成(「Object」 → 「FuncA」)
var a = new FuncA();
// 出力テスト
trace(a instanceof Object); // true
trace(a instanceof FuncA); // true
trace(a instanceof FuncB); // false
trace(a instanceof FuncC); // false
// インスタンスBを作成(「Object」 → 「FuncA」 → 「FuncB」)
var b = new FuncB();
// 出力テスト
trace(b instanceof Object); // true
trace(b instanceof FuncA); // true
trace(b instanceof FuncB); // true
trace(b instanceof FuncC); // false
// インスタンスCを作成(「Object」 → 「FuncA」 → 「FuncB」 → 「FuncC」)
var c = new FuncC();
// 出力テスト
trace(c instanceof Object); // true
trace(c instanceof FuncA); // true
trace(c instanceof FuncB); // true
trace(c instanceof FuncC); // true
■オブジェクトの種類を特定する
Flash 6 以降から利用できます。
まず、データ型がオブジェクトであるか調べます。
データの型を調べるには、typeof 演算子を使用します。
"object" 値が得られれば、オブジェクトの一種であることがわかります。
オブジェクトから、コンストラクタ関数を取得するには、constructor プロパティを使用します。
このプロパティの中身と、特定のコンストラクタ関数が一致するか比較します。
配列オブジェクトであるか調べる (Flash 6 以降)
// 配列オブジェクトを作成
var variable = new Array();
// オブジェクトの一種であるか調べる
if(typeof(variable) == "object"){
// コンストラクタ関数と、Array が一致するか調べる
if(variable.constructor == Array){
trace("配列オブジェクトである");
}
}
Object オブジェクトであるか調べる (Flash 6 以降)
// Object オブジェクトを作成
var variable = new Object();
// オブジェクトの一種であるか調べる
if(typeof(variable) == "object"){
// コンストラクタ関数と、Object が一致するか調べる
if(variable.constructor == Object){
trace("Object オブジェクトである");
}
}
TextField オブジェクトであるか調べる (Flash 6 以降)
// TextField オブジェクトを作成
_root.createTextField ( "tf" , 1 , 0 , 0 , 100 , 20 );
var variable = _root.tf;
// オブジェクトの一種であるか調べる
if(typeof(variable) == "object"){
// コンストラクタ関数と、TextField が一致するか調べる
if(variable.constructor == TextField){
trace("TextField オブジェクトである");
}
}
if文を使って一括コメントアウトする
■書き出しの最適化を利用する
Flash を書き出すと、アクションスクリプトの文字列がコンパイルされ、
Flash Player 上で動作するバイトコードに変換されます。
その変換中に一部のアクションスクリプトの記述が最適化されます。
例えば、以下のように定数のみで演算を記述した場合、書き出されたバイトコードはすでに計算済みの状態となります。
定数で演算を記述する
var v = 1 + 2 + 3 * 4;
最適化された状態(イメージ図です)
var v = 15;
また、if 文の条件式に定数を記述すると、if 文自体が省略されます。
定数で if 文を記述する
if(0){
var a = 0;
}else{
var b = 0;
}
最適化された状態(イメージ図です)
var b = 0;
この if 文の最適化を利用すると、コメントアウトの変わりとして使用できます。
if 文としても機能するので、デバッグ用とリリース用の書き出しを切り替えるといった用途に使えそうです。
最適化を利用してコメントアウトとして使用する
// デバッグ時は 0、リリース時は 1 に変更する
if(0){
trace("リリース用の処理です。")
}else{
trace("デバッグ用の処理です。")
}
実際に最適化されているかを調べたいときは、デバッガを起動してブレークポイントて中断後、「ステップイン」で1つずつ進めてみましょう。
if文に差し掛かったときに比較文で停止せずにさらに次のステップまで1度にジャンプした場合は、最適化により省略されている事がわかります。
if 文の比較文には、定数を指定する必要があります。変数を指定すると最適化されません。
また関数の宣言については注意が必要です。if 文の中で関数を宣言しても実際に使用する事はできません。動的に関数を作成した場合は使用可能です。