Beautifl - Flash Gallery

Thumbnail : NeonHearts
NeonHearts
miyaoka 2009-08-27 MIT License

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

//press to draw heart shapes
package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import caurina.transitions.Tweener;
	import flash.display.BlendMode;
	[SWF(width = "465", height = "465", backgroundColor = 0x0, frameRate = "60")]
	
	public class HeartDraw extends Sprite 
	{
		public function HeartDraw():void 
		{
			graphics.beginFill(0);
			graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
			
			var isPress:Boolean = false;
			stage.addEventListener(MouseEvent.MOUSE_DOWN, function ():void 
			{
				isPress = true;
			});
			stage.addEventListener(MouseEvent.MOUSE_UP, function ():void 
			{
				isPress = false;
			});
			
			addEventListener(Event.ENTER_FRAME, function ():void 
			{
				if(!isPress) return;
				
				var h:HeartSprite = new HeartSprite();
				h.blendMode = BlendMode.ADD;
				h.x = mouseX;
				h.y = mouseY;
				h.scaleX *= (Math.random() * 0.5 + 0.75);
				h.scaleY *= (Math.random() * 0.5 + 0.75);
				h.rotation = (Math.random() - 0.5) * 60,
				addChild(h);
				Tweener.addTween(h, {
					x: h.x + (Math.random() -0.5) * 300,
					y: h.y + 200 + Math.random()*300,
					scaleX: h.scaleX * 0.2,
					scaleY: h.scaleY * 0.2,
					rotation: h.rotation * (Math.random() * 1.5 + 1.5),
					time: 2.0 + Math.random()*1.5,
					transition: "easeInBack",
					onComplete: function ():void 
					{
						removeChild(h);
					}
				});
			});
		}
	}
}
import flash.display.Graphics;
import flash.display.Sprite;
import flash.display.Shape;
import flash.geom.Point;
import caurina.transitions.Tweener;
import flash.filters.BlurFilter;

class HeartSprite
extends Sprite
{
	public var t:Number = 0;
	public static var trans:Array = [
		"easeInOutQuad",
		"linear",
		"easeInCubic"//,
//		"easeOutCubic"
	];
	private var fillShape:Shape = new Shape();
	public function HeartSprite():void 
	{
		
		scaleY *= -1;
		if (Math.random() < 0.5) scaleX *= -1;

		var h:HeartSegment = new HeartSegment(Math.random()*50 + 10);
		var g:Graphics = graphics;
		var g2:Graphics = fillShape.graphics;
		var lastT:Number = 0;
		var step:Number = 1 / 50;
		
		g.lineStyle(Math.random() * 6 + 2, 
		(Math.random() * 0x66 + 0x99) << 16 |
		(Math.random() * 0x66 + 0x99) << 8 |
		(Math.random() * 0x66 + 0x99)
		);
		
		//set startPt to random
//		t = (Math.random() < 0.5) ? 0 : 0.5;
//		lastT = t;
//		var pt:Point = h.getValue(t);
//		g.moveTo( pt.x, pt.y);
//		g2.moveTo(pt.x, pt.y);
		g2.beginFill(
			(Math.random() * 0x3f + 0xc0) << 16 |
			(Math.random() * 0x99) << 8 |
			(Math.random() * 0x99)
			);
		
				filters = [
				new BlurFilter()
				];
		
		Tweener.addTween(this, {
			t:t+1,
			time: 0.5 + Math.random()*1.0,
			transition: trans[Math.floor(Math.random()*trans.length)],
			onUpdate: function ():void 
			{
				while ((lastT += step) < t)
				{
					var pt:Point = h.getValue(lastT);
					g.lineTo( pt.x, pt.y);
					g2.lineTo( pt.x, pt.y);
					
				}
				pt = h.getValue(t);
				g.lineTo( pt.x, pt.y);
				g2.lineTo( pt.x, pt.y);
				lastT = t;
			},
			onComplete: function ():void 
			{
				g.clear();
				addChild(fillShape);

				fillShape.alpha = 0;
				Tweener.addTween(fillShape, {
					alpha:1.0,
					scaleX: 1.2,
					scaleY: 1.2,
					time:0.5,
					transition: "easeOutQuint"
				});
			}
		});
	}
}

class HeartSegment
{
	private var len:Number;
	private var bss:Array = [];
	public function HeartSegment(len:Number = 30):void 
	{		
		this.len = len;
		
		//--nodes
		
		//bottom
		var n0:Point = new Point(0, 0);		
		//left top
		var n1:Point = Point.polar(len * 2 * (Math.random()* 0.5 +1), Math.PI * (7/12 + Math.random() * 1 / 6));
		//top
		var n2:Point = new Point((Math.random()-0.5)*len*0.25, len * Math.sqrt(3));
		//right top
		var n3:Point = Point.polar(len * 2 * (Math.random()* 0.5 +1), Math.PI *  (5/12 - Math.random() * 1 / 6));
		
		
		//--controls
		var c10:Number = 0.5 + Math.random() * 1 / 6;
		var c11:Number = 0.5 + Math.random() * 1 / 12;
		
		var c20:Number = 0.5 - Math.random() * 1 / 12;
		var c21:Number = 0.5 - Math.random() * 1 / 6;
		
		var c00:Number = 0.5 + Math.random() * 1 / 6;
		var c01:Number = c10 + 1;
		
		var c30:Number = c21 + 1;
		var c31:Number = 0.5 - Math.random() * 1 / 6;
		

		//bezierSegments
		bss =
		[
			new BezierSegment_(
				n0,
				n0.add(Point.polar(len, Math.PI * c00)),
				n1.add(Point.polar(len, Math.PI * c01)),
				n1
			),
			new BezierSegment_(
				n1,
				n1.add(Point.polar(len, Math.PI * c10)),
				n2.add(Point.polar(len, Math.PI * c11)),
				n2
			),
			new BezierSegment_(
				n2,
				n2.add(Point.polar(len, Math.PI * c20)),
				n3.add(Point.polar(len, Math.PI * c21)),
				n3
			),
			new BezierSegment_(
				n3,
				n3.add(Point.polar(len, Math.PI * c30)),
				n0.add(Point.polar(len, Math.PI * c31)),
				n0
			)
		];
	}
	public function getValue(t:Number):Point
	{
		t -= Math.floor(t);
		t *= bss.length;
		var i:int = Math.floor(t);
		return BezierSegment_(bss[i]).getValue(t-i);
	}
}

/**
 * A Bezier segment consists of four Point objects that define a single cubic Bezier curve.
 * The BezierSegment class also contains methods to find coordinate values along the curve.
 * @playerversion Flash 9.0.28.0
 * @langversion 3.0
 * @keyword BezierSegment, Copy Motion as ActionScript
 * @see ../../motionXSD.html Motion XML Elements  
 */
class BezierSegment_
{
    public var a:Point;
    public var b:Point;
    public var c:Point;
	public var d:Point;
	function BezierSegment_(a:Point, b:Point, c:Point, d:Point)
	{
		this.a = a;
		this.b = b;
		this.c = c;
		this.d = d;
	}
	public function getValue(t:Number):Point
	{
		var ax:Number = this.a.x;
		var x:Number = (t*t*(this.d.x-ax) + 3*(1-t)*(t*(this.c.x-ax) + (1-t)*(this.b.x-ax)))*t + ax;
		var ay:Number = this.a.y;
		var y:Number = (t*t*(this.d.y-ay) + 3*(1-t)*(t*(this.c.y-ay) + (1-t)*(this.b.y-ay)))*t + ay;
		return new Point(x, y);	
	}
}