文字モニョモニョ動く

by hashito
MainStage
♥0 | Line 181 | Modified 2011-06-01 23:55:49 | MIT License
play

ActionScript3 source code

/**
 * Copyright hashito ( http://wonderfl.net/user/hashito )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/d7T3
 */

// forked from hashito's 文字集まる修正
// MainStage
package {
    import flash.display.Sprite;
    [SWF(frameRate=60,width=456,height=456)]
    public class MainStage extends Sprite {
        public function MainStage(){
            addChild(new Main());
        }
    }
}

import flash.display.*;
import flash.filters.BlurFilter;
import flash.geom.Point;
import flash.geom.ColorTransform;
import flash.geom.*;
import flash.events.*;
import flash.utils.Timer;
import flash.text.TextField;
import flash.text.TextFormat;
import net.hires.debug.Stats;
// debug
class debug{public static var out:TextField=new TextField();}

/*t.hashito*/
// もう疲れた!






class MF{
    public static function AFFORD (x:Number,aim:Number,a:Number):Boolean{return (x<=(a+aim))&&(x>=(a-aim));}
    public static function RAN (n:Number=1):Number{return (Math.random()*n);}
    public static function ISPM (n:Number):Number{if(n<0){return -1;}else if(n>0){return 1;}return 0;}
    public static function MAX (n:Number,max:Number):Number{return (n>max)?max:n;}
    public static function MIN (n:Number,min:Number):Number{return (n<min)?min:n;}
    public static function LIMIT (n:Number,max:Number,min:Number):Number{if(n>max){return max;}else if(n<min){return min;}else{return n};}
    public static function RAD_ANG(n:Number):Number{return n*180/Math.PI}
    public static function ANG_RAD(n:Number):Number{return n*Math.PI/180 }
    public static function LATCH(v:Boolean,s:Boolean,r:Boolean):Boolean{if(s)v=true;if(r)v=false;return v;}
    public static function ONE_SHOT_ON(v:Boolean,o:Boolean):Boolean{var r:Boolean = (v==(!o));o=v;return r;}
    public static function DOT2(x1:Number,y1:Number,x2:Number,y2:Number):Number{return x1 * x2 + y1 * y2; }//内積
    public static function SLOPE(x1:Number,y1:Number,x2:Number,y2:Number):Number{return (y1-y2)/(x1-x2) }//傾き(無限の可能性あり)
    public static function DISTANCE(x1:Number,y1:Number,x2:Number,y2:Number):Number{var a:Number=(x2-x1);var b:Number=(y2-y1);return Math.sqrt(a*a+b*b);}//距離
}

class Main extends Sprite{
    public const H:Number = 456;
    public const W:Number = 456;
    public const BAL_W_MAX :Number = 15;
    public const BAL_H_MAX :Number = H/(BAL_W*2)-5;
    public const BAL_W     :Number = (W/BAL_W_MAX)/2;
    public const BAL_IX:Number = W/2;
    public const BAL_IY:Number = H - BAL_W;
    public const BAL_OFFSET:Number = Math.sqrt((BAL_W*BAL_W)/2);
    
    public var BAL_COLOR_S :Array  = [0x00ff00,0xccff00,0xcc00cc,0x5500ff,0x555500];
    
    public var kal:Boolean = false;
    public var kar:Boolean = false;
    public var ksp:Boolean = false;
    
    public var gun:Shape   = new Shape();
    //public var ball:Shape  = new Shape(),bax:Number=0,bay:Number=0,ac:Boolean=false;
    
    public var bits:Array = new Array();
    
    public var tx:TextField=new TextField();
    public var bb:Bitmap,pen:Shape,canvas:Sprite;
    
    //public var bd:BitmapData=new BitmapData(W,H,true,0);
    
    // constructor
    public function Main() {addEventListener(Event.ADDED_TO_STAGE, init);}
    
    public function msg(s:String):void{
        tx.text = s;
        tx.x = W/2-tx.textWidth/2;
        tx.y = H/2-tx.textHeight/2;
    }
    // init
    public function init(e:*):void{
        // debug
        // debug.out.autoSize=flash.text.TextFieldAutoSize.LEFT;
        // addChild(debug.out);
        pen=new Shape();
        canvas=new Sprite();
        canvas.addChild(pen);
        bb = new Bitmap(new BitmapData(W,H,false,0xffffff));
        pen.graphics.beginFill(0);
        pen.graphics.drawCircle(0,0,2);
        addChild(bb);
        addChild(canvas);
        
        //addChild(new Bitmap(bd));
        
        // ball init
        //ball.graphics.beginFill(uint(BAL_COLOR_S[int(MF.RAN(BAL_COLOR_S.length))]));
        //ball.graphics.drawCircle(0,0,BAL_W);
        //ball.x = BAL_IX;
        //ball.y = BAL_IY;
        //addChild(ball);
        
        // msg init
        tx.autoSize   = flash.text.TextFieldAutoSize.CENTER;
        tx.selectable = false;
        addChild(tx);
        
        addEventListener(Event.ENTER_FRAME ,ef);
        stage.addEventListener(KeyboardEvent.KEY_DOWN ,key);
        stage.addEventListener(KeyboardEvent.KEY_UP   ,key);
       //stage.addEventListener(MouseEvent.MOUSE_DOWN ,modechg);


        var s:Stats = new Stats();
        addChild(s);
        addChild(test);
        t_init();
        
        //public function setChar(c:String,x:int,y:int):void{
        setChar("W",W/2,H/2);//MF.RAN(W),MF.RAN(H));
        
        
    }
    public function key(e:KeyboardEvent=null):void{
        if (e.keyCode == 37) { kal = ( e.type == KeyboardEvent.KEY_DOWN ); }// left
        if (e.keyCode == 39) { kar = ( e.type == KeyboardEvent.KEY_DOWN ); }// right
        if (e.keyCode == 32) { ksp = ( e.type == KeyboardEvent.KEY_DOWN ); }// space
        setChar( String.fromCharCode(e.keyCode),MF.RAN(W),MF.RAN(H));
    }
    public var test:Sprite = new Sprite();

    public  var icounts:int ;
    public function ef(e:Event=null):void{
        
        icounts++;
        // goto文の代わりに while to break
        while(1){
             if(icounts>10){
             //ball.x = ball.x + (mouseX - ball.x)*0.1;
             //ball.y = ball.y + (mouseY - ball.y)*0.1;
             // ~~~~移動~~~~~
              for each (var bs:Object in bits){
                  var n:Object={x:0,y:0};
                  n.x = bs[0].x+Math.floor((MF.RAN(2)-1)*K);
                  n.y = bs[0].y+Math.floor((MF.RAN(2)-1)*K);
                  
                  bs.pop();
                  bs.unshift(n);
              }
             // ~~~~描画~~~~~
             
             bb.bitmapData.fillRect(new Rectangle(0, 0, W, H), 0xffffff);
             for each (var bss:Object in bits){
                  for (var l:int=0;l<bss.length;l++){
                  pen.x = bss[l].x;
                  pen.y = bss[l].y;
                  
                  bb.bitmapData.draw(canvas);
                  }
             }
             icounts=0;
             }else{
             icounts++;
             }
             break;
        }
        //debug.out.text="x="+t.bits[0].x+" y="+t.bits[0].y+" vx="+t.bits[0].vx+" vy="+t.bits[0].vy+" ax="+t.bits[0].ax+" ay="+t.bits[0].ay;
    }
    
    
    //+++++++++++++++++++++++++++++++++++++++++++
    // 文字作成関連
    //+++++++++++++++++++++++++++++++++++++++++++
    public const K:int=2; //bitとbitの離れ係数
    // 文字のビットマップを作るbitmapdataの大きさ
    private const B_X:int=200 , B_Y:int=100;
    // 文字のビットマップwk
    private var b:BitmapData =new BitmapData(B_X,B_Y,true,T_BC);
    // ビットマップの元
    private var t:TextField=new TextField();
    // ビットマップの元となるテキストデータの設定値
    private const T_FC:uint=0xffffff,T_FC2:uint=0xfff000,T_BC:uint=0;
    // 文字データ作成系の初期化
    private function t_init():void{
        var tf:TextFormat=new TextFormat();
        t.autoSize   = flash.text.TextFieldAutoSize.LEFT;
        t.background = true;
        t.backgroundColor = T_BC;
        t.textColor=T_FC;
        tf.size  = B_Y-1;
        tf.letterSpacing  = 1;
        t.setTextFormat(tf);
    }
    // 文字データ設定(表示したい文字,位置x,位置y)
    public function setChar(c:String,x:int,y:int):void{
        var v:Array = new Array();//この文字を表示するbitを入れておく配列
        
        t.text = c.charAt(0);    //念のため1文字目を取得
        b.fillRect(b.rect,T_BC); //前の文字を削除
        b.draw(t);               //文字をビットマップ上に描画
        //ビットマップの読み取り
        var w:int=b.width,h:int=b.height;//,ran:int=0;
        
        var n:Object={x:0,y:0};
        for(var im:int=0;im<(w*h);im++){
            var cl:int;
            var st1:Boolean;
            var st2:Boolean;
            cl  = b.getPixel(n.x,n.y);
            st1 = (cl== T_FC  );
            st2 = (cl== T_FC2 );
            
            if(st1||st2){
                var vv:Object={x:0,y:0};
                vv.x = n.x*K+x;
                vv.y = n.y*K+y;
                v.push(vv);
                if(st1){
                    b.setPixel(n.x,n.y,T_FC2);
                }else{
                    b.setPixel(n.x,n.y,T_BC );
                }
                if(      b.getPixel(n.x+1,n.y  )==T_FC){n.x++;      }
                else if( b.getPixel(n.x+1,n.y+1)==T_FC){n.x++;n.y++;}
                else if( b.getPixel(n.x  ,n.y+1)==T_FC){      n.y++;}
                else if( b.getPixel(n.x-1,n.y+1)==T_FC){n.x--;n.y++;}
                else if( b.getPixel(n.x-1,n.y  )==T_FC){n.x--;      }
                else if( b.getPixel(n.x-1,n.y-1)==T_FC){n.x--;n.y--;}
                else if( b.getPixel(n.x  ,n.y-1)==T_FC){      n.y--;}
                else if( b.getPixel(n.x+1,n.y-1)==T_FC){n.x++;n.y--;}
                else                                   {
                    
                    if(      b.getPixel(n.x+1,n.y  )==T_FC2){n.x++;      }
                    else if( b.getPixel(n.x+1,n.y+1)==T_FC2){n.x++;n.y++;}
                    else if( b.getPixel(n.x  ,n.y+1)==T_FC2){      n.y++;}
                    else if( b.getPixel(n.x-1,n.y+1)==T_FC2){n.x--;n.y++;}
                    else if( b.getPixel(n.x-1,n.y  )==T_FC2){n.x--;      }
                    else if( b.getPixel(n.x-1,n.y-1)==T_FC2){n.x--;n.y--;}
                    else if( b.getPixel(n.x  ,n.y-1)==T_FC2){      n.y--;}
                    else if( b.getPixel(n.x+1,n.y-1)==T_FC2){n.x++;n.y--;}
                    else                                    {break;}
                }
            }else{
                if(++n.x >= w){
                    n.x=0;
                    n.y++;
                }
            }
        }
        bits.push(v);
    }
}