BlendModeとBlurFilterを使った。

by mmlemon_
import components.Arc;
♥0 | Line 123 | Modified 2009-09-25 04:54:51 | MIT License
play

ActionScript3 source code

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

package
{
	//import components.Arc;
	
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.filters.BlurFilter;
	import flash.geom.Point;
        import flash.geom.Matrix;
        import flash.display.BlendMode;
        import flash.display.GradientType;

	[SWF(backgroundColor=0x0,frameRate=60,width=465,height=465)]
	public class Circle3 extends Sprite
	{
		private static const CENTER:Point = new Point(465/2, 465/2);
		private var m_arcNum:uint = 10;
		private var arcs:Vector.<Arc>;
		private var colorContainer:Sprite;

		private function init():void
		{
			arcs = new Vector.<Arc>();
			for(var i:uint=0;i < m_arcNum; i++)
			{
				createArc();
				arcs[i].rotation = 360/m_arcNum*i;
			}
			initColorContainer();
			addEventListener(Event.ENTER_FRAME, onLoop, false, 0,false);
			
			
		}
private function initColorContainer():void
		{
			colorContainer = new Sprite();
			
			var matrix:Matrix = new Matrix();
			matrix.createGradientBox(800, 600, 0, 0, 0);
			var type:String = GradientType.RADIAL;
			var colors:Array = [0xff0000, 0xffff00, 0x00ff00, 0x00ffff, 0x0000ff, 0xff00ff];
			var alphas:Array = [1, 1, 1, 1, 1, 1];
			var ratios:Array = [0, 50, 100, 150, 200, 255];
			colorContainer.graphics.beginGradientFill(type, colors, alphas, ratios, matrix);
			
			colorContainer.graphics.drawRect(0, 0, 800, 600);
			colorContainer.graphics.endFill();
			// 要するにこれで抜いた感じ。
			colorContainer.blendMode = BlendMode.SUBTRACT;
			addChild(colorContainer);
		}
		private function createArc():void
		{
			var arc:Arc = new Arc(6);
			arc.x = CENTER.x;
			arc.y = CENTER.y;
			arc.arcWidth = 200;
			arc.arcHeight = 100;
			
			addChild(arc);
			
			arcs.push(arc);
		}
		private function onLoop(event:Event):void
		{
			for(var i:uint=0; i < m_arcNum; i++)
			{
				arcs[i].rotation+=2;
			}
		}
		
		public function Circle3()
		{
			init();
		}
	}
}
	import flash.display.BlendMode;
	import flash.display.CapsStyle;
	import flash.display.JointStyle;
	import flash.display.LineScaleMode;
	import flash.display.Sprite;
	import flash.display.StageQuality;
	import flash.filters.BlurFilter;

class Arc extends Sprite
	{
		private var m_thickness:Number;
		private var m_arcWidth:Number;
		private var m_arcHeight:Number;
		public function get arcWidth():Number
		{
			return m_arcWidth;
		}
		public function set arcWidth(value:Number):void
		{
			m_arcWidth = value;
			updateShape();
		}
		public function get arcHeight():Number
		{
			return m_arcHeight;
		}
		public function set arcHeight(value:Number):void
		{
			m_arcHeight = value;
			updateShape();
		}
		private function updateShape():void
		{
			updateArc();
			width = m_arcWidth;
			height = m_arcHeight;
		}
		
		private function updateArc():void
		{
			graphics.clear();
			graphics.lineStyle(m_thickness, 0xffffff, 1, false, 
			LineScaleMode.VERTICAL, CapsStyle.ROUND, JointStyle.ROUND, 3);
			var lines:uint = 5;
			for(var i:uint=1; i < lines; i++)
			{
				graphics.moveTo(0,0);
				graphics.curveTo(m_arcWidth/i, m_arcHeight*i, m_arcWidth*i, m_arcHeight*i);
			}
			graphics.endFill();
			
			var blur:BlurFilter = new BlurFilter(45, 5, 1);
			filters = [blur];
		}
		
		public function Arc(_thickness:Number)
		{
			super();
			blendMode = BlendMode.ADD;
			m_thickness = _thickness;
		}
	}