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

 

TextSnapshot クラスについて

 


■TextSnapshot クラスについて

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

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

 
TextSnapshot オブジェクトを取得するには、DisplayObjectContainer クラスの textSnapshot プロパティを使用します。
 
アクセスしたい静止テキストが含まれる、親ムービークリップなどのオブジェクトから呼び出します。
 
ムービークリップ "mc" から、TextSnapshot オブジェクトを取得する

import flash.text.TextSnapshot;

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


 

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

 
 


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

 
静止テキストの総文字数を取得するには、charCount プロパティを使用します。
 
int 型の数値が得られます。
 
通常であれば、改行文字は総数に含まれません。
 
静止テキストが、テキストフィールドとして出力された場合、改行文字が総数に含まれます。
 
ムービークリップ mc 内の静止テキストの、総文字数を取得する

import flash.text.TextSnapshot;

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

// 静止テキストの総文字数を取得する
var count:int = text_snapshot.charCount;

trace(count);
 

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

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

import flash.text.TextSnapshot;

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

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

trace(str);
 

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

 
範囲を指定して、文字の詳細情報を調べるには、getTextRunInfo() メソッドを使用します。
 
第02引数で指定する終了位置は、取得対象に含まれます。
 
TextSnapshot.getTextRunInfo( 開始位置 , 終了位置 , [結果に改行文字を含むか?] ) :Array
第01引数 int開始位置を指定します。(0 から始まる番号)
第02引数 int終了位置を指定します。(0 から始まる番号、ここで指定した位置まで)
戻り値 Array配列が得られます。(文字の数だけオブジェクトが配列に格納された状態)
 
■戻り値
 
戻り値から配列が得られます。文字の数だけ、オブジェクトが格納されています。
 
オブジェクトのプロパティは、以下の通りです。
 
プロパティ名解説
indexInRunNumber割り振られている位置(0 から始まる番号)
selectedBoolean選択状態であるか?
fontStringフォント名
coloruint文字のカラー情報、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 内の静止テキストの、すべての文字の詳細情報を取得する

import flash.text.TextSnapshot;

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

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

// 配列に格納されているオブジェクトのプロパティをすべて出力
var i:int;
var num:int = ary.length;
for(i=0;i < num;i++){
	var obj:Object = ary[i];
	trace("[" + i + "]");
	var key:String;
	for(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 以降)

import flash.text.TextSnapshot;
import flash.events.MouseEvent;

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

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

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

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

import flash.text.TextSnapshot;

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

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

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


 

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

 
 


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

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

import flash.text.TextSnapshot;

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

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

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

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

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

import flash.text.TextSnapshot;

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

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

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


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

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

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

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

import flash.text.TextSnapshot;

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

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

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

trace(selected);
 

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

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

import flash.text.TextSnapshot;

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

// 静止テキストの総文字数を取得する
var num:int = text_snapshot.charCount;

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

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

trace(str);