モーションタイポとBitmap(AS3)
こちらの続き。
後日、ASのどの処理の箇所で重くなっているのか調べてみたらcopypixelsの箇所でした。
これでAS3でやれば軽くなる確信を得たので(その根拠は?といわれると困る)AS3化してみることに。
で、コレ。
ASで生成したテキストフィールド、それを別のMCにDrawしたものはそのまま表示させています。
1×1のMCの数は約1400個。
前回のエントリの25ptのほうが同じような数のMCなので、AS3すごい!
初めてAS3のすごさを感じました。
以下スクリプト。
ですが、
ほかのモーションタイポをベースとして制作し始めたのでごみが残っている可能性あります。
まぁ、このままでは面白くないモーションなので、いろいろと付け足すことになるかと思います。
Tweenerを利用しています。
Tweenerいいっすね。
軽い。
Fuse Kitみたいにフィルタは利用できませんが。
(TweenerでもBlurは利用できます。)
/*=============================================================== MotionTypo - Contraction AS3 Version Date : 2007.09.29 ===============================================================*/ package { import flash.display.Sprite; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFormat; import flash.display.Bitmap; import flash.display.BitmapData; import flash.geom.Rectangle; import flash.geom.Point; import caurina.transitions.Tweener; public class Contraction extends Sprite { private var msgString:String; private var typoWidth:Number; private var typoHeight:Number; private var pixelSprite:Array = new Array(); public function Contraction() { } // "表示文字列", "フォントカラー", フォントサイズ, "フォントタイプ" public function initMotion(msg:String, fontColor:String, fontSize:Number, fontType:String, chrMargin:Number) { msgString = msg; var typoFmt:TextFormat = new TextFormat(); typoFmt.color = Number("0x" + fontColor); typoFmt.size = fontSize; typoFmt.font = fontType; var TypoChrTmp:Sprite = new Sprite(); var MotionTypo = new TextField(); MotionTypo.autoSize = TextFieldAutoSize.LEFT; MotionTypo.text = msg; MotionTypo.embedFonts = true; MotionTypo.setTextFormat(typoFmt); TypoChrTmp.addChild(MotionTypo); TypoChrTmp.y = 50; addChild(TypoChrTmp); var TypoChr:Sprite = new Sprite(); var myBitmapData:BitmapData = new BitmapData(TypoChrTmp.width, TypoChrTmp.height, true, 0x00000000); myBitmapData.draw(TypoChrTmp); var bmp:Bitmap = new Bitmap(myBitmapData); TypoChr.addChild(bmp); addChild(TypoChr); TypoChr.y = 80; typoWidth = TypoChr.width; typoHeight = TypoChr.height; trace(typoWidth); trace(typoHeight); for(var i = 0; i < typoWidth; i++) { for(var j = 0; j < typoHeight; j++) { var myPixelData:BitmapData = new BitmapData(1, 1, true, 0x00000000); myPixelData.copyPixels(myBitmapData, new Rectangle(i, j, i + 1, j+ 1), new Point(0, 0)); if(myPixelData.getPixel32(0, 0) != 0) { var PixelTypo:Sprite = new Sprite(); var PixelBmp:Bitmap = new Bitmap(myPixelData); PixelTypo.addChild(PixelBmp); addChild(PixelTypo); PixelTypo.x = randRange(i - 40, i + 40); PixelTypo.y = randRange(j - 40, j + 40); PixelTypo.alpha = 0; targetX[i] = i; targetY[j] = j; pixelSprite.push([i, j, PixelTypo]); } else { myPixelData.dispose(); targetX[i] = -1; targetY[j] = -1; } } } //TypoChrTmp.removeMovieClip(); //TypoChr.removeMovieClip(); motion(1.5, 1.5); } public function motion(motionDelay:Number, motionTime:Number) { for (var i:String in pixelSprite) { Tweener.addTween(pixelSprite[i][2], {x:pixelSprite[i][0], y:pixelSprite[i][1], alpha:1, transition:"easeincubic", time:motionTime, delay: randRangeNoFloor(0, motionDelay)}); } } private function randRange(min:Number, max:Number):Number { var randomNum:Number = Math.floor(Math.random() * (max - min + 1)) + min; return randomNum; } private function randRangeNoFloor(min:Number, max:Number):Number { var randomNum:Number = Math.random() * (max - min + 1) + min; return randomNum; } } }