In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

[Matrix練習]マウスの速さと方向に反応する三角形

Get Adobe Flash player
by esukei 27 Apr 2010
/**
 * Copyright esukei ( http://wonderfl.net/user/esukei )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/hZ3R
 */

package {
    import flash.display.Sprite;
    import flash.display.BitmapData;
    import flash.display.Bitmap;
    import flash.geom.Point;
    import flash.events.*;
    import flash.geom.Matrix;
    import flash.geom.Rectangle;
    public class FlashTest extends Sprite {
    	
    		//ビットマップ
    		private var bitmapData:BitmapData;
    		private var bitmap:Bitmap;
    		
    		//三角形書く用
    		private var sprite:Sprite;
    		
    		//1フレーム前のマウス座標格納用。特にPointにする必要なかったけど使ってみたかっただけ。
    		private var point:Point;
    		
    		//変形用マトリクス
    		private var matrix:Matrix;
    		
    		//コンストラクタ
        public function FlashTest() {
            
            //フレームレート設定
            stage.frameRate = 30;
            
            //スプライト準備
            sprite = new Sprite();
            //三角形描画
            sprite.graphics.beginFill(0x000000,1.0);
            sprite.graphics.moveTo(0, 0);
            sprite.graphics.lineTo(0, 50);
            sprite.graphics.lineTo(50, 25);
            sprite.graphics.lineTo(0, 0);
            sprite.graphics.endFill();
            
            //マトリックス初期化
            matrix = new Matrix();
            
            //ビットマップ初期化
            bitmapData = new BitmapData(stage.stageWidth,stage.stageHeight,true,0x00000000);
            bitmap = new Bitmap(bitmapData);
            addChild(bitmap);
            
            //ポイント初期化。とりあえずマウス座標代入
            point = new Point(mouseX, mouseY);
            
            //ループ設定
            addEventListener(Event.ENTER_FRAME, loop);
        }
        
        //マウス座標の差分用。なんでここはポイントにしなかったか良く分からん。
        private var dx:Number;
        private var dy:Number;
        //角度
        private var r:Number;
        //距離
        private var d:Number;
        
        //メインループ
        private function loop(e:Event):void
        {
        		//差分取得
        		dx = mouseX - point.x;
        		dy = mouseY - point.y;
        		
        		//角度計算
        		r = Math.atan2(dy,dx);
        		
        		//移動距離
        		d = Math.sqrt(dx*dx + dy*dy);
        		
        		//ステージの対角線を基準にして移動距離の割合でアルファ変化(1.2かけてちょっと見た目補正)
        		bitmap.alpha = d / Math.sqrt(stage.stageWidth*stage.stageWidth + stage.stageHeight*stage.stageHeight) * 1.2;
        		
        		/**
        		 * ここから変形開始
        		 */
        		//まずは変形基準点が三角形の鼻先になるように移動
        		matrix.translate(-50,-25);
        		
        		//移動距離に応じて三角形の長さ変化。0.1とか/15とかは見た目補正
        		matrix.scale(0.1+d/15,1);
        		
        		//角度設定
        		matrix.rotate(r);
        		
        		//マウスの所まで移動
        		matrix.translate(mouseX,mouseY);
        		
        		//ビットマップにdraw
        		bitmapData.lock();
        		bitmapData.fillRect(new Rectangle(0,0,stage.stageWidth,stage.stageHeight),0x00000000);
        		bitmapData.draw(sprite,matrix);
        		bitmapData.unlock();
        		
        		/**
        		 * matrixに逆順で元に戻るように変形かけて初期化
        		 * ※これって毎度毎度newするのとどっちが良いんだろうね。
        		 */
        		matrix.translate(-mouseX,-mouseY);
        		matrix.rotate(-r);
        		matrix.scale(1/(0.1+d/15),1);
        		matrix.translate(50,25);
        		
        		//マウスの座標を保存
        		point.x = mouseX;
        		point.y = mouseY;
        		
        }
    }
}