s26

パーティクルを文字にする。

結構前に作ったパーティクルの集合です。
本を参考に作ってみたので、今見てみると必要のない記述みたいのもいくつかあって面白いです。

テキスト作成
→テキストと同じ大きさのビットマップ作成
→ビットマップにテキストをdraw(コピーに近い)
→コピーしたものから、1pxづつ色のデータを取り出す。
→パーティクルには位置の情報と色の情報を中にいれる。
→パティクルの配置をランダムにして個数の制限を設けた上で、元の場所に戻るように設定。





コードの解説↓


package {
    import flash.display.Sprite;
    import flash.display.MovieClip;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.geom.Rectangle;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormat;

    public class ParticleText extends Sprite {
        //カンバスの生成
        private var canvas:BitmapData;
        private var textCanvas:BitmapData;
        private var particles:Array;
        private var _num:int;
        private var maxDis:int = 400;
        public function ParticleText() {

            //bitmapdata作成して背景にします(普通に背景設定でよいと思います。)
            canvas = new BitmapData(stage.stageWidth,stage.stageHeight,false,0x000000);
            addChild( new Bitmap(canvas) );

            //テキストフィールドを作成します。
            var tf:TextField = new TextField;
            tf.defaultTextFormat = new TextFormat("Swis721 BdRndBT",60,0xFFFFFF);
            tf.autoSize = TextFieldAutoSize.LEFT;
            tf.text = "オレの\nいちごオ・レ";//好きなテキストを中にいれれば。
            textCanvas = new BitmapData(tf.textWidth,tf.textHeight,false,0x000000);
            textCanvas.draw(tf);
            particles = new Array();
            createText();
            addEventListener(Event.ENTER_FRAME,onEnterFrame);
            stage.addEventListener(MouseEvent.CLICK,onClick);
        }

        public function createText():void{
            //すべてを1pixelごとに色を取得していき、もし黒以外の色であれば、ピクセルを作成
            var ofx:Number = stage.stageWidth/2 - textCanvas.width/2;
            var ofy:Number = stage.stageHeight/2 - textCanvas.height/2;
            for ( var ex:Number = 0;ex < textCanvas.width;ex++){
                for (var ey:Number = 0;ey < textCanvas.height;ey++){
                    var c:uint = textCanvas.getPixel(ex,ey);
                    if(c != 0x000000){
                        createParticle(ex + ofx,ey + ofy,c);
                    }
                }
            }
        }
        public function createParticle(ex:Number,ey:Number,c:int):void{
            //色の情報と、位置の情報を取得しえて格納する。
            var p:Particle = new Particle();
            p.ex = ex;
            p.ey = ey;
            p.c = c;
            initParticle(p);
            particles.push(p)
            _num = 0;
        }
        public function initParticle(p:Particle):void{
            //位置の情報を元に、ランダムで散らばるようなファンクションを作成する。
            var rad:Number = Math.random()*(Math.PI*2);
            var dis:Number = Math.random()*maxDis;
            p.x = p.ex+ dis * Math.cos(rad);
            p.y = p.ey + dis * Math.sin(rad);
        }
        private function onEnterFrame( evt:Event ):void{
            //キャンバス自体は黒でロックをしておく。
            canvas.lock();
            canvas.fillRect( canvas.rect,0x000000 );

            for (var i:int = 0;i