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

 

TextSnapshot クラスについて

 


■TextSnapshot クラスについて

 
TextSnapshot クラスを使用すると、ムービークリップ内に存在する、すべての静止テキストの文字にアクセスする事ができます。
 
■静止テキストについて
 
静止テキストを、動的に生成して配置することはできません。
 
静止テキストは、Adobe Flash のツールから、静的にステージ上に配置できるオブジェクトの一種です。
 
Adobe Flash のツールから書き出された後は、配置オブジェクトの状態ではなくなります。
 
ただし、「選択可能を指定」「デバイスフォントを指定」等の設定をした場合、静止テキストではなくテキストフィールドとして出力される事があります。
 
テキストフィールドとして出力されているかは、デバッガの階層プレビューで確認できます。
 
静止テキストは、テキストフィールドのようにリッチに制御できる機能はありません。
 
すべての静止テキストの文字には、番号が割り振られている状態となっています。
 
番号を指定して、文字を取得したり、文字の選択属性を設定することができます。
 

■TextSnapshot オブジェクトを取得する

 
TextSnapshot オブジェクトを取得するには、MovieClip クラスの getTextSnapshot() メソッドを使用します。
 
アクセスしたい静止テキストが含まれる、親ムービークリップから呼び出します。
 
ムービークリップ "mc" から、TextSnapshot オブジェクトを取得する

// ムービークリップ "mc" から、TextSnapshot オブジェクトを取得する
var text_snapshot = mc.getTextSnapshot();
 


 

静止テキストの文字を取得する

 
 


■静止テキストの総文字数を取得する

 
静止テキストの総文字数を取得するには、getCount() メソッドを使用します。
 
改行文字は、総数に含まれません。
 
ムービークリップ mc 内の静止テキストの、総文字数を取得する

// ムービークリップ "mc" から、TextSnapshot オブジェクトを取得する
var text_snapshot = mc.getTextSnapshot();

// 静止テキストの総文字数を取得する
var count = text_snapshot.getCount();

trace(count);
 

■範囲を指定して、文字列を取得する

 
範囲を指定して、文字列を取得するには、getText() メソッドを使用します。
 
第02引数で指定する終了位置は、取得対象に含まれません。
 
TextSnapshot.getText( 開始位置 , 終了位置 , [結果に改行文字を含むか?] ) :String
第01引数 Number開始位置を指定します。(0 から始まる番号)
第02引数 Number終了位置を指定します。(0 から始まる番号、ここで指定した位置から1文字前まで)
第03引数(略可)Boolean戻り値の文字列に改行文字を含みたい場合は true、改行文字を省略する場合は false、デフォルトは false
戻り値 String開始位置から終了位置の1つ前までの文字が、文字列として返る
 
ムービークリップ mc 内の静止テキストの、 4 文字目から 7 文字目までの文字列を取得する

// ムービークリップ "mc" から、TextSnapshot オブジェクトを取得する
var text_snapshot = mc.getTextSnapshot();

// 静止テキストの 4 文字目から 7 文字目までの文字列を取得する
var str = text_snapshot.getText(4,8);

trace(str);
 

■範囲を指定して、文字の詳細情報を調べる

 
範囲を指定して、文字の詳細情報を調べるには、getTextRunInfo() メソッドを使用します。
 
第02引数で指定する終了位置は、取得対象に含まれます。
 
TextSnapshot.getTextRunInfo( 開始位置 , 終了位置 , [結果に改行文字を含むか?] ) :Array
第01引数 Number開始位置を指定します。(0 から始まる番号)
第02引数 Number終了位置を指定します。(0 から始まる番号、ここで指定した位置まで)
戻り値 Array配列が得られます。(文字の数だけオブジェクトが配列に格納された状態)
 
■戻り値
 
戻り値から配列が得られます。文字の数だけ、オブジェクトが格納されています。
 
オブジェクトのプロパティは、以下の通りです。
 
プロパティ名解説
indexInRunNumber割り振られている位置(0 から始まる番号)
selectedBoolean選択状態であるか?
fontStringフォント名
colorNumber文字のカラー情報、ARGB (0xFFFFFFFF)
heightNumber文字の高さ
matrix_aNumber文字の行列(Matrix.a プロパティに相当)
matrix_bNumber文字の行列(Matrix.b プロパティに相当)
matrix_cNumber文字の行列(Matrix.c プロパティに相当)
matrix_dNumber文字の行列(Matrix.d プロパティに相当)
matrix_txNumber文字の行列(Matrix.tx プロパティに相当)
matrix_tyNumber文字の行列(Matrix.ty プロパティに相当)
corner0xNumber文字の境界矩形の左下の x 座標
corner0yNumber文字の境界矩形の左下の y 座標
corner1xNumber文字の境界矩形の右下の x 座標
corner1yNumber文字の境界矩形の右下の y 座標
corner2xNumber文字の境界矩形の右上の x 座標
corner2yNumber文字の境界矩形の右上の y 座標
corner3xNumber文字の境界矩形の左上の x 座標
corner3yNumber文字の境界矩形の左上の y 座標
 
■文字の境界矩形 (corner 系プロパティ)
 
corner 系プロパティは、使用フォントが、swf ファイルに埋め込まれている場合にのみ取得可能です。
 
 
取得例です。
 
ムービークリップ mc 内の静止テキストの、すべての文字の詳細情報を取得する

// ムービークリップ "mc" から、TextSnapshot オブジェクトを取得する
var text_snapshot = mc.getTextSnapshot();

// 静止テキストのすべての文字の詳細情報を取得する
var ary = text_snapshot.getTextRunInfo(0,text_snapshot.getCount()-1);

// 配列に格納されているオブジェクトのプロパティをすべて出力
var i;
var num = ary.length;
for(i=0;i < num;i++){
	var obj = ary[i];
	trace("[" + i + "]");
	for(var key in obj){
		trace(key + ":" + obj[key]);
	}
}
 

■座標を指定して、当たり判定のある文字を取得する

 
座標を指定して、当たり判定のある文字を取得するには、hitTestTextNearPos() メソッドを使用します。
 
結果を得るには、使用フォントが、swf ファイルに埋め込まれている必要があります。
 
TextSnapshot.hitTestTextNearPos( x座標 , y座標 , [円の半径] ) :Number
第01引数 Number当たり判定用の x 座標
第02引数 Number当たり判定用の y 座標
第03引数(略可)Number円形の当たり判定を追加したい場合指定。円の半径。 (デフォルトは 0)
戻り値 Number当たり判定のある文字の位置(0 から始まる番号)、当たり判定が無い場合は -1
 
■第01~02引数 当たり判定用座標
 
第01~02引数で指定した「座標」と、「文字の矩形」とで当たり判定が取られます。(下の図の赤色の矩形)
 
■第03引数 円の半径
 
第03引数を指定すると、更に「円形」の当たり判定が追加されます。(下の図の青色の円形)
 
当たり判定としたい、文字の中心からの距離を指定します。
 
 
取得例です。
 
ムービークリップ mc 内の静止テキストと、マウスカーソルとで当たり判定を取る (Flash 6 以降)

// ムービークリップ "mc" から、TextSnapshot オブジェクトを取得する
var text_snapshot = mc.getTextSnapshot();

// マウスカーソルを移動するたびに実行されるイベント
mc.onMouseMove = function (){
	var pos = text_snapshot.hitTestTextNearPos(this._xmouse,this._ymouse);
	if(pos < 0){
		trace("当たり判定なし");
	}else{
		trace("当たり判定あり:" + pos);
	}
};
 

■文字列を指定して、位置を検索する

 
文字列を指定して、位置を検索するには、findText() メソッドを使用します。
 
TextSnapshot.findText( 開始位置 , 検索文字列 , 大文字と小文字の区別するか? ) :Number
第01引数 Number検索を開始する位置を指定(0 から始まる番号)
第02引数 String検索したい文字列
第03引数 Boolean検索時に大文字と小文字を区別するなら true、区別しないなら false
戻り値 Number見つかった場合文字列の先頭位置(0 から始まる番号)、見つからなかった場合は -1
 
ムービークリップ mc 内の静止テキストから、"abc" という文字列の位置を検索する

// ムービークリップ "mc" から、TextSnapshot オブジェクトを取得する
var text_snapshot = mc.getTextSnapshot();

// 静止テキストから "abc" という文字列の位置を検索する
var pos = text_snapshot.findText(0,"abc",true);

if(pos < 0){
	trace("見つかりませんでした");
}else{
	trace("見つかりました:" + pos);
}
 


 

静止テキストの文字の選択属性を設定する

 
 


■選択状態の文字の背景色を設定する

 
選択されている文字の背景を塗りつぶすことができます。
 
背景色を表示するには、使用フォントが、swf ファイルに埋め込まれている必要があります。
 
選択状態の文字の背景色を設定するには、setSelectColor() メソッドを使用します。
 
TextSnapshot.setSelectColor( カラー ) :Void
第01引数 Number背景色を指定、RGB (0xFFFFFF)
戻り値 Voidなし
 
ムービークリップ mc 内の静止テキストの、選択状態の文字の背景色を設定する

// ムービークリップ "mc" から、TextSnapshot オブジェクトを取得する
var text_snapshot = mc.getTextSnapshot();

// 選択状態の文字の背景色を設定する
text_snapshot.setSelectColor(0xFF0000);

// すべての文字を選択に変更する
text_snapshot.setSelected(0,text_snapshot.getCount(),true);
 

■範囲を指定して、文字の選択属性を設定する

 
範囲を指定して、文字の選択属性を設定するには、setSelected() メソッドを使用します。
 
繰り返してメソッドを呼び出す事で、1文字ごとに選択属性を設定することができます。
 
第02引数で指定する終了位置は、設定対象に含まれません。
 
TextSnapshot.setSelected( 開始位置 , 終了位置 , [選択するか?] ) :Void
第01引数 Number開始位置を指定します。(0 から始まる番号)
第02引数 Number終了位置を指定します。(0 から始まる番号、ここで指定した位置から1文字前まで)
第03引数 Boolean選択属性を有効に設定するには true、無効に設定するには false
戻り値 Voidなし
 
ムービークリップ mc 内の静止テキストの、選択属性を設定する

// ムービークリップ "mc" から、TextSnapshot オブジェクトを取得する
var text_snapshot = mc.getTextSnapshot();

// 0 文字目から 9 文字目までの選択属性を有効に設定する
text_snapshot.setSelected(0,10,true);

// 3 文字目から 7 文字目までの選択属性を無効に設定する
text_snapshot.setSelected(3,8,false);


// 静止テキストのすべての文字の詳細情報を取得する
var ary = text_snapshot.getTextRunInfo(0,text_snapshot.getCount()-1);

// 選択属性を出力テスト
var i;
var num = ary.length;
for(i=0;i < num;i++){
	trace("[" + i + "] selected:" + ary[i].selected);
}
 

■範囲を指定して、選択状態の文字が存在するか調べる

 
範囲を指定して、選択状態の文字が存在するか調べるには、getSelected() メソッドを使用します。
 
第02引数で指定する終了位置は、取得対象に含まれません。
 
TextSnapshot.getSelected( 開始位置 , [終了位置] ) :Boolean
第01引数 Number開始位置を指定します。(0 から始まる番号)
第02引数(略可)Number終了位置を指定します。省略した場合最後尾まで調べます。(0 から始まる番号、ここで指定した位置から1文字前まで)
戻り値 Boolean1文字でも選択属性が有効であれば true、すべての文字の選択属性が無効であれば false
 
ムービークリップ mc 内の静止テキストの、選択属性を調べる

// ムービークリップ "mc" から、TextSnapshot オブジェクトを取得する
var text_snapshot = mc.getTextSnapshot();

// 0 文字目から 9 文字目までの選択属性を有効に設定する
text_snapshot.setSelected(0,10,true);

// 4 文字目の選択属性を調べる
var selected = text_snapshot.getSelected(4,5);

trace(selected);
 

■選択状態の文字を文字列として取得する

 
選択状態の文字を文字列として取得するには、getSelectedText() メソッドを使用します。
 
TextSnapshot.getSelectedText( [結果に改行文字を含むか?] ) :String
第01引数(略可)Boolean戻り値の文字列に改行文字を含みたい場合は true、改行文字を省略する場合は false、デフォルトは false
戻り値 String選択状態の文字が連結され、文字列として返る
 
ムービークリップ mc 内の静止テキストの、選択状態の文字を文字列として取得する

// ムービークリップ "mc" から、TextSnapshot オブジェクトを取得する
var text_snapshot = mc.getTextSnapshot();

// 静止テキストの総文字数を取得する
var num = text_snapshot.getCount();

var i;
for(i=0;i < num;i+=2){
	// 偶数位置の文字の選択属性を有効に設定する
	text_snapshot.setSelected(i,i+1,true);
}

// 選択状態の文字を文字列として取得する
var str = text_snapshot.getSelectedText();

trace(str);