想像でどどん波を描いてみた

by _shimabox
...
マウスダウンでパワーを貯めて、任意の場所でマウスアップ → 発射
@author _shimabox
♥0 | Line 219 | Modified 2010-01-22 18:38:28 | MIT License
play

ActionScript3 source code

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

package 
{
	import flash.display.Graphics;
	import flash.display.Sprite;
	import flash.display.Stage;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.filters.BlurFilter;
	import flash.filters.GlowFilter;
	import flash.geom.Point;
	import flash.utils.Timer;
	import flash.events.TimerEvent;
	import net.hires.debug.Stats;
	import org.libspark.betweenas3.BetweenAS3;
	import org.libspark.betweenas3.tweens.ITween;
	import org.libspark.betweenas3.events.TweenEvent;
	
	/**
	 * ...
	 * マウスダウンでパワーを貯めて、任意の場所でマウスアップ → 発射
	 * @author _shimabox
	 */
	public class Main extends Sprite 
	{
		private const TIMER_COUNT:int = 100;
		private const COLOR:uint = 0xffff00;
		private const GLOW_COLOR:uint = 0xff8989;
		private const LINIT_SIZE:uint = 20;
		private var _dodonpa:Sprite;
		private var _downPoint:Point;
		private var _upPoint:Point;
		private var _drawTimer:Timer;
		private var _downTimer:Timer;
		private var _addX:Number = 0;
		private var _addY:Number = 0;
		private var _lineGF:GlowFilter;
		private var _dodonGF:GlowFilter;
		private var _bf:BlurFilter;
		private var _downTime:int = 0;
		
		public function Main():void 
		{
			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
			this.stage.addEventListener(MouseEvent.MOUSE_DOWN, this.mouseDownHandler);
			this._lineGF = new GlowFilter(COLOR , 1, 6, 6, 2, 1, false, true);
			this._dodonGF = new GlowFilter(GLOW_COLOR, 1, 16, 16);
			this._bf = new BlurFilter(16, 16, 1);
                        Wonderfl.capture_delay( 5 );
			//this.addChild(new Stats());
		}
		
		private function mouseDownHandler(e:MouseEvent):void
		{	
			if (this._drawTimer) return;
			this._downTime = 0;
			this.initMousePoint();
			this._downPoint = new Point(this.mouseX, this.mouseY);
			this.stage.addEventListener(MouseEvent.MOUSE_UP, this.mouseUpHandler);
			this._downTimer = new Timer(100,0)
			this._downTimer.start();
			this._downTimer.addEventListener(TimerEvent.TIMER, this.drawPower);
		}
		
		private function initMousePoint():void
		{
			this._downPoint = this._upPoint = null;
		}
		
		private function drawPower(e:TimerEvent):void
		{
			this.collectPower();
			this.savePower();
		}
		
		private function collectPower():void
		{
			var power:Sprite = new Sprite();
			var g:Graphics = power.graphics;
			var pr:int = this._downTime + 150 + ((Math.random() * 100)-50)>>0;
			var theta:Number = (Math.random() * 360) >> 0;
			var r:int = (Math.random() * 10) >> 0;
			var red:uint = ( COLOR & 0xff0000 ) >> 16;
			var green:uint = ( COLOR & 0xff00 ) >> 8;
			var blue:uint = ( COLOR & 0xff );
			var rs:String, gs:String, bs:String;
			rs = '0' +  (red).toString(16);
			gs = '0' +  (green - Math.random()*200 >> 0).toString(16);
			bs = '0' +  (blue).toString(16);
			var color:uint = uint('0x' + rs + gs + bs);
			g.clear();
			g.beginFill(color, 1);
			g.drawCircle(0, 0, r < 1 ? 1 : r);
			g.endFill();
			power.filters = [this._bf];
			power.x = pr * Math.cos(theta) + _downPoint.x;
			power.y = pr * Math.sin(theta) + _downPoint.y;
			
			this.addChild(power);
			
			BetweenAS3.apply(power,
				{ 
					_glowFilter: {
						blurX: 16,
						blurY: 16,
						alpha: 1,
						color:GLOW_COLOR
					}
				} 
			);
			
			var _tween:ITween = BetweenAS3.tween(power,
				{
					x: this._downPoint.x, y: this._downPoint.y, alpha: .2,
					_glowFilter: {
						blurX: 16,
						blurY: 16,
						alpha: .2
					}
				},
				{z: Math.floor(Math.random() * 2) % 2 ? 500 : -100},
				1
			);
			
			_tween.addEventListener(TweenEvent.COMPLETE, tweenComplete);
			_tween.play();
		}
		
		private function tweenComplete(e:TweenEvent):void 
		{
			if (this.contains(e.target.target)) 
				this.removeChild(e.target.target);
		}
		
		private function savePower():void
		{
			if (this._downTime <= LINIT_SIZE) this._downTime++;
			else return;
			
			var power:Sprite = new Sprite();
			var g:Graphics = power.graphics;
			
			g.clear();
			g.beginFill(COLOR, 0.8);
			g.drawCircle(0, 0, this._downTime);
			g.endFill();
			if (this._downTime >= 4) power.filters = [this._bf, this._dodonGF];
			power.x = this._downPoint.x;
			power.y = this._downPoint.y;
			this.addChild(power);
		}
		
		private function mouseUpHandler(e:MouseEvent):void
		{	
			this.stage.removeEventListener(MouseEvent.MOUSE_UP, this.mouseUpHandler);
			this._upPoint = new Point(this.mouseX, this.mouseY);
			this._downTimer.stop();
			this._downTimer.removeEventListener(TimerEvent.TIMER, this.drawPower);
			this.clear();
			this.draw();
		}
		
		private function draw():void
		{
			var diffX:Number = _upPoint.x - _downPoint.x;
			var diffY:Number = _upPoint.y - _downPoint.y;
			var diff:Number = Math.sqrt(diffX * diffX + diffY * diffY);
			var sw:Number = this.stage.stageWidth;
			this._drawTimer = new Timer(sw / 4 > diff ? 1 : sw / 2 > diff ? 4 : 8, TIMER_COUNT)
			this._drawTimer.start();
			this._drawTimer.addEventListener(TimerEvent.TIMER, onTimerHandler);
			this._drawTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onCompleteTimerHandler);
			this._dodonpa = new Sprite();
			var g:Graphics = this._dodonpa.graphics;
			g.clear();
			g.beginFill(COLOR, 0.8);
			g.drawCircle(0, 0, this._downTime);
			g.endFill();
		}
		
		private function onTimerHandler(e:TimerEvent):void 
		{
			var dp:Point = this._downPoint;
			var up:Point = this._upPoint;
			var cnt:int   = this._drawTimer.currentCount;
			var diffX:Number = (up.x - dp.x) / TIMER_COUNT;
			var diffY:Number = (up.y - dp.y) / TIMER_COUNT;
			var line:Sprite = new Sprite();
			var g:Graphics = line.graphics;
			g.clear();
			g.lineStyle(1, 0, 1);
			
			switch(cnt)
			{
				case 1 : 
					g.moveTo(dp.x, dp.y)
					g.lineTo(dp.x + diffX, dp.y + diffY)
					this._addX = dp.x + diffX;
					this._addY = dp.y + diffY;
					this._dodonpa.x = dp.x + diffX;
					this._dodonpa.y = dp.y + diffY;
					this._dodonpa.filters = [this._bf, this._dodonGF];
					this.addChild(this._dodonpa);
					break;
				case TIMER_COUNT : 
					g.moveTo(this._addX, this._addY);
					g.lineTo(up.x, up.y);
					this._dodonpa.x = up.x
					this._dodonpa.y = up.y
					break;
				default : 
					g.moveTo(this._addX, this._addY);
					this._addX += diffX;
					this._addY += diffY;
					g.lineTo(this._addX, this._addY);
					this._dodonpa.x = this._addX;
					this._dodonpa.y = this._addY;
				    break;
			}
			
			line.filters = [this._lineGF,this._dodonGF];
			this.addChildAt(line, cnt);
			this.swapChildren(this._dodonpa, line);
		}
		
		private function onCompleteTimerHandler(e:TimerEvent):void 
		{
			this._drawTimer.removeEventListener(TimerEvent.TIMER, onTimerHandler);
			this._drawTimer.removeEventListener(TimerEvent.TIMER_COMPLETE, onCompleteTimerHandler);
			this._drawTimer = null;
			this.clear();
		}
		
		private function clear():void
		{
			while (this.numChildren > 0) {
				this.removeChildAt(0);
				if(this._dodonpa) this._dodonpa = null;
			}
		}
	}
}