PixelText variation (4)
2007/09/30 23:03 - tweener
今回から、PixelText バリエーションの微妙な差異を生み出す以下の3変数の個々について、詳しい説明をおこないます。
- Main.as のクラスプロパティ scale:uint
- Pixelize.as の createPositions メソッド内、new AqLetter() の第2引数であるオブジェクト { font:String , size:uint }
まずは 1. から説明します。単独の変数 scale について。
scale
Pixelize.createPositions の第2引数として指定された scale は、一度、Pixelize クラスのクラスプロパティに保持されます。
<Main.as での当該箇所> for ( var i:int=0; i<len; i++ ) { positions[i] = Pixelize.createPositions( strs[i] , scale ); } <Pixelize.as での当該箇所> private static var scale:uint; // セルの1辺の長さ public static function createPositions( dispStr : String , // 表示文字列 scl : uint = 1 // セルの1辺の長さ ):Array { // 引数処理 scale = scl;
最初に、テキストをピクセル化するための BitmapData 領域サイズを決定するために使用されます。
// ピクセル化する文字列 var aqLetter:AqLetter = new AqLetter( …… // 文字列部分のサイズを取得 var w:Number = Math.ceil( aqLetter.width ) * scale; var h:Number = Math.ceil( aqLetter.height ) * scale; // センタリング用オフセット var offsetx:Number = -w * 0.5; var offsety:Number = -h * 0.5; // テキストを BitmapData 化 var bmd:BitmapData = new BitmapData( w , h , …… bmd.draw( aqLetter );
実はこれ、別に BitmapData の領域を scale 倍する必要はなくて、センタリング用オフセットの値にだけ scale が反映されていればいいんです。
本来なら、w と h を計算する時は sclae 倍せずに、offsetx と offsety を計算するときに scale 倍すれば充分、……ということに今気づきました(ダサ)。
必要もないのに BitmapData を大きく取って、メモリを浪費するなんて意味がないので、次回にソースを晒すときには書き換えようと思います。
次に scale が使われるのは、ピクセル化するために文字列走査をおこなうときです。
for ( var cntx:int=0; cntx<w; cntx++ ) { for ( var cnty:int=0; cnty<h; cnty++ ) { // ピクセル ARGB 取得 argb = bmd.getPixel32( cntx , cnty ); // 各セルの座標計算 if ( ((argb>>24)&0xFF) != 0 ) { posx = ( cntx + 0.5 ) * scale + offsetx; posy = ( cnty + 0.5 ) * scale + offsety; pos_array.push( { posx:posx , posy:posy } ); } } }
この二つが Pixelize.createPositions での scale 使用です。
そして Pixelize.createCells がコールされた際に、クラスプロパティとして保持されていた scale が再び参照されます。
// セル生成 while( len-- ) { obj_array.push( new Cell( scale , 0xffffff , 0.5 , true , 0xffffff ) ); }
ここでは生成するセルオブジェクトの1辺の大きさとして使用します。