モーションタイポとBitmap(AS3)

こちらの続き。

後日、ASのどの処理の箇所で重くなっているのか調べてみたらcopypixelsの箇所でした。

これでAS3でやれば軽くなる確信を得たので(その根拠は?といわれると困る)AS3化してみることに。

で、コレ

ASで生成したテキストフィールド、それを別のMCにDrawしたものはそのまま表示させています。

1x1の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;
        }

    }
}

トラックバック(0)

このブログ記事に対するトラックバックURL: http://eternitydesign.net/mt/mt-tb.cgi/170

コメントフォーム

AUTHOR

名古屋でひっそりと活動中。
ホームページ制作、Flashコンテンツ制作など制作依頼がありましたらお気軽にご連絡ください。
ご希望の方には制作実績も同時にお伝えいたします。

TAG CLOUD