ActionScript Learning 110303

3.3.2011

残像の表現2。

残像の表現をBitmapDataを使って作成する。

BitmapDataを使わずに残像を表現する。
フェードアウトを透明度で表現すると線と線のつなぎ目が見苦しいので、ColorHSLの輝度を調整して表現した。

SAMPLE VIEW CODE

package {
	
	import flash.display.*;
	import flash.events.*	
	import flash.filters.*; 
	import flash.geom.*; 


	public class NMain extends MovieClip {
		
		//-------------------------------------------------------------------------------- Properties

		private var _this:*;
		private var _stage:Stage;
		
		
		//-------------------------------------------------------------------------------- Constractor
		
		public function NMain() {
			
			_this = this;
			_stage = stage;
			
			_stage.scaleMode = StageScaleMode.NO_SCALE;
			_stage.align = StageAlign.TOP_LEFT;
			
			Init();
		}
		
		
		//-------------------------------------------------------------------------------- Function
		 
		/**
		 * initialize
		 */
		public function Init():void {

			initmain();
		}
		
		/**
		 * initialize main
		 */
		private var _main:MovieClip;
		private var _line:MovieClip;
		private var _line_2:MovieClip;
		private var addpnt:Point;
		private var lastpnt:Point;
		private var mdown:Boolean;
		
		private function initmain():void {
			
			_main = new MovieClip();
			_this.addChild(_main);
			
			addpnt = new Point();
			addpnt.x = Math.round(_stage.stageWidth / 2);
			addpnt.y = Math.round(_stage.stageHeight / 2);
			
			lastpnt = new Point();
			lastpnt.x = addpnt.x;
			lastpnt.y = addpnt.y;
			
			_line = new line();
			_line_2 = new line();
			
			var blurval:Number = 50;
			_line.filters = [new BlurFilter(blurval, blurval, 1)];
			
			_line_2.filters = [new BlurFilter(10, 10, 1)];
			_line_2.alpha = .8;
			
			_main.addChild(_line_2);
			_main.addChild(_line);
			

			_this.addEventListener(Event.ENTER_FRAME, main_enterframe);
			
			_stage.addEventListener(MouseEvent.MOUSE_DOWN, function(){mdown = true});
			_stage.addEventListener(MouseEvent.MOUSE_UP, function(){mdown = false});
		}
		/** */
		private var linesize:Number;
		private var linesize_2:Number;
		private var tgtpointx:Number;
		private var tgtpointy:Number;
		
		private function main_enterframe(eo:* = null):void {
			
			if(mdown) {
				
				tgtpointx = _main.mouseX;
				tgtpointy = _main.mouseY;
			}
			else {
				
				tgtpointx = Math.round(_stage.stageWidth / 2);
				tgtpointy = Math.round(_stage.stageHeight / 2);
			}
			
			var disx = tgtpointx - addpnt.x;
			var disy = tgtpointy - addpnt.y;
			
			linesize = 120 - Math.abs(Math.sqrt(disx * disx + disy * disy) / 4);
			if(linesize < 20) linesize = 20;
			
			linesize_2 = 20 - Math.abs(Math.sqrt(disx * disx + disy * disy) / 4);
			if(linesize_2 < 10) linesize_2 = 10;
			
            addpnt.x +=  (tgtpointx - addpnt.x) * .2; 
            addpnt.y +=  (tgtpointy - addpnt.y) * .2;
			
			var currentpnt = new Point();
			
			currentpnt.x = addpnt.x;
			currentpnt.y = addpnt.y;
			
			_line.Draw(linesize, currentpnt, lastpnt, mdown);
			_line_2.Draw(linesize_2, currentpnt, lastpnt, mdown);
			
			lastpnt = currentpnt;
			
		}



	}
}





package {
	
	import flash.display.*;
	import flash.events.*
	import flash.geom.*;
	
	import frocessing.color.*;


	public class line extends MovieClip {
		
		//-------------------------------------------------------------------------------- Properties

		private var _this:*;
		
		
		//-------------------------------------------------------------------------------- Constractor
		
		public function line() {
			
			_this = this;
			
			setup();
		}
		
		
		//-------------------------------------------------------------------------------- Function
		
		/**
		 * setup
		 */
		private var linesarr:Array;
		private var colorhsv:ColorHSV;
		private var colorhsl:ColorHSL;
		private var colorcount:int;
		
		private function setup():void {
			
			linesarr = [];
			
			colorhsv = new ColorHSV();
			colorhsv.h = 0;
			colorhsv.s = .6;
			colorhsv.v = 1;
			
			colorhsl = new ColorHSL();
			colorhsl.h = 0;
			colorhsl.s = 1;
			colorhsl.l = .5;		
		}
		 
		/**
		 * draw
		 */
		public function Draw(linesize:Number, currentpnt:Point, lastpnt:Point, mdown:Boolean):void {
			
			var linemc:MovieClip = new MovieClip();			
			linesarr.push(linemc);
			
			if(linesarr.length > 60) {
				
				linesarr[0].visible = false;
				_this.removeChild(linesarr[0]);
				linesarr.shift();
			}
			
			colorcount += 1;
			if(colorcount > 360) colorcount -= 360;			
			
			linemc.linesize = linesize;
			linemc.startpoint = currentpnt;
			linemc.goalpoint = lastpnt;
			linemc.colorcount = colorcount;
				
			_this.addChild(linemc);
			
			var lightness:Number = .5 / linesarr.length;
			
			for(var i:int = 0; i < linesarr.length; i++) {
				
				var tgtline:MovieClip = linesarr[linesarr.length - 1 -i];
				
				colorhsl.h = tgtline.colorcount;				
				colorhsl.l = .5 + (lightness * i * .6);
				
				var g:Graphics = tgtline.graphics;
				g.clear();
				
				g.beginFill(colorhsl.value, 1);
				g.drawCircle(tgtline.startpoint.x, tgtline.startpoint.y, tgtline.linesize / 2);
				g.endFill();
				
				g.lineStyle(tgtline.linesize, colorhsl.value, 1, false, "normal", "round");
				g.moveTo(tgtline.startpoint.x, tgtline.startpoint.y);
				g.lineTo(tgtline.goalpoint.x, tgtline.goalpoint.y);
			}
		}		


	}
}






category : ActionScript / Flash / Frocessing

Demonstrations

Feature Samples

Author

虹村 マキオウ (nizimura makiou)

猫と太極拳を愛する横浜在住のフリーランスクリエイターです。

logo

Demo and Sample

Category