Beautifl - Flash Gallery

Thumbnail : ラインを沢山引きます
ラインを沢山引きます
okoi 2010-12-26 MIT License

再生するにはFlash Playerが必要です。デスクトップのブラウザでご覧ください。

// forked from okoi's flash on 2010-3-11
package {
    import flash.display.Sprite;
	import flash.display.MovieClip
	import flash.display.Sprite;
	import flash.display.Graphics;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.BlendMode;
    
    public class FlashTest extends Sprite {

		var	pathMC:MovieClip = new MovieClip();
		var pathlist:Array = new Array();
		
		var drawBMPData:BitmapData;
		var drawBMP:Bitmap;
		var drawMC:MovieClip = new MovieClip();

		var drawFlag:Boolean = false;
    
        public function FlashTest() {
            // write as3 code here..
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
            
        }
        	
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			
			// BackGround
			var g:Graphics = graphics;
			g.beginFill( 0x000000 );
			g.drawRect( 0, 0, stage.stageWidth, stage.stageHeight );
			
			//	addMC
			addChild(pathMC);
			
			drawBMPData = new BitmapData( stage.stageWidth,  stage.stageHeight, true, 0x00000000 );
			drawBMP = new Bitmap(drawBMPData);
			addChild(drawBMP);
			
			//	CreatePath
			var p:Path = new Path();

			for ( var i:int = 0; i < 200; i++ )
			{
				p = new Path();
				p.Init(0, 0, 5 + (i/20), 0.5, 50);
				pathlist.push(p);
			}
			
			
			addEventListener(Event.ENTER_FRAME, EnterFrame);
			stage.addEventListener(MouseEvent.MOUSE_DOWN, ChangeDrawFlag );
			stage.addEventListener(MouseEvent.MOUSE_UP, ChangeDrawFlag );
		}
		
		public	function EnterFrame(event:Event):void 
		{
			//	DrawPath
			var g:Graphics = pathMC.graphics;
			g.clear();
			g.beginFill( 0xFFFFFF, 1 );
			//g.lineStyle (10, 0x000000, 1.0);	// 線のスタイル
			
			for each ( var p:Path in pathlist )
			{
				//	マウスの位置更新
				p.SetMousePos( stage.mouseX, stage.mouseY );
				if( !drawFlag )	g.drawCircle( p.point.x, p.point.y, 1 );
			}
			
			//	描画処理
			if ( drawFlag )
			{
				g = drawMC.graphics;
				g.clear();
				
				for ( var i:int = 0; i < pathlist.length - 1; i++ )
				{
					g.lineStyle (1, pathlist[i].color, 0.1);	// 線のスタイル
					g.moveTo( pathlist[i].prev.x, pathlist[i].prev.y );
					g.lineTo( pathlist[i].point.x, pathlist[i].point.y );
				}
				//	書いたデータをビットマップに追加
				drawBMPData.draw( drawMC, null, null, BlendMode.ADD ); 
			}
			
			
		}
		
		public	function ChangeDrawFlag(event:MouseEvent):void 
		{
			if ( drawFlag ) drawFlag = false;
			else 			drawFlag = true;

			//var	color:Array = [0xFF0000 , 0xFFFF00 , 0x00FF00 , 0x00FFFF , 0x0000FF];
			
			var colorMax:uint = 0xFFFF;
			var colorMin:uint = 0xFF00;
			
			for ( var i:int = 0; i < pathlist.length - 1; i++ )
			{
				pathlist[i].color = 0xFF0000 + 0xFF00 * (i/(pathlist.length-1));
			}
		}        
    }
}
import flash.display.MovieClip;
import flash.events.Event;
import flash.geom.Point;

	internal class Path extends MovieClip
	{
		var prev:Point = new Point();
		var	point:Point = new Point();
		var mouse:Point = new Point();
		
		var move:Point = new Point();
		
		var accele:Number = 1;
		var slowdown:Number = 1;
		var maxspeed:Number = 1;
		
		var color:uint;
		
		public function Path() 
		{
			super();
			addEventListener(Event.ENTER_FRAME, EnterFrame );
		}
		
		/**
		 * 
		 * @param	x
		 * @param	y
		 * @param	accele	マウスから離れて行く時の加速値
		 * @param	_effect
		 */
		public	function Init(x:int = 0, y:int = 0, _accele:Number = 1, _slowdown:Number = 1, _maxspeed:Number = 20):void 
		{
			prev.x = point.x = x;
			prev.y = point.y = y;
			move.x = 0;
			move.y = 0;
			accele = _accele;
			slowdown = _slowdown;
			maxspeed = _maxspeed;
		}
		
		public	function SetMousePos(x:int, y:int):void
		{
			mouse.x = x;
			mouse.y = y;
		}
		
		public	function EnterFrame(event:Event):void 
		{
			prev.x = point.x;
			prev.y = point.y;
			
			//	マウスとの距離を出す
			//	そこから影響係数を掛けて移動力を出す
			var nowLen:Number = Math.sqrt( (mouse.x - prev.x) * (mouse.x - prev.x) + (mouse.y - prev.y) * (mouse.y - prev.y) );		
			//var power:Number = len * power;
			var rad:Number = Math.atan2((mouse.y - point.y), (mouse.x - point.x));
			
			/*
			move.x /= 0.5;
			move.y /= 0.5;
			
			var	rate:Number = 1 - (len / 100);
			if ( rate < 0 )	rate = 0;
			var power:Number = 1 + rate * 10;
			//if ( 100 - len > 0 ) rate = (100-len)/10;
			power = 1;			
			
			move.x += Math.cos( rad ) * power;
			move.y += Math.sin( rad ) * power;
			*/
			
			move.x += Math.cos( rad ) * accele;
			move.y += Math.sin( rad ) * accele;
			
			
			//	移動速度、角度算出
			//	あまりにも速度が大きくなったら正規化する
			var moveS:Number = Math.sqrt( move.x * move.x + move.y * move.y );
			var moveR:Number = Math.atan2(move.y, move.x);
			
			if ( moveS >= maxspeed )
			{
				move.x = Math.cos( moveR ) * maxspeed;
				move.y = Math.sin( moveR ) * maxspeed;
			}
			
			point.x += move.x;
			point.y += move.y;
			
			//	離れていってる時ならスピード減衰
			var nextLen:Number = Math.sqrt( (mouse.x - point.x) * (mouse.x - point.x) + (mouse.y - point.y) * (mouse.y - point.y) );
			if ( nowLen < nextLen )
			{
				move.x *= slowdown;
				move.y *= slowdown;
			}

		}
		
	}