残像の表現2。
残像の表現をBitmapDataを使って作成する。
BitmapDataを使わずに残像を表現する。
フェードアウトを透明度で表現すると線と線のつなぎ目が見苦しいので、ColorHSLの輝度を調整して表現した。
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);
}
}
}
}