BitmapDataを使った残像の表現。
残像の表現をBitmapDataを使って作成する。
BitmapDataをdrawするときに効果を追加していくのがポイント。
マウスダウンでラインの太さが変化します。
package {
import flash.display.*;
import flash.events.*
import flash.filters.*;
import flash.geom.*;
import frocessing.color.*;
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 _canvas:BitmapData;
private var _line:MovieClip;
private var colorhsv:ColorHSV;
private var colcnt:int;
private var addpnt:Point;
private var lastpnt:Point;
private var mdown:Boolean;
private function initmain():void {
_main = new MovieClip();
_canvas = new BitmapData(_stage.stageWidth, _stage.stageHeight, true, 0x000000);
_this.addChild(new Bitmap(_canvas));
_this.addChild(_main);
colorhsv = new ColorHSV();
colcnt = 0;
colorhsv.s = .6;
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();
_main.addChild(_line);
_this.addEventListener(Event.ENTER_FRAME, main_enterframe);
_this.addEventListener(Event.ENTER_FRAME, main_enterframe_2);
linesize = linesize_min;
_stage.addEventListener(MouseEvent.MOUSE_DOWN, function(){mdown = true});
_stage.addEventListener(MouseEvent.MOUSE_UP, function(){mdown = false});
}
/** */
private var linesize_min:Number= 20;
private var linesize_max:Number= 160;
private var linesize:Number = linesize_min;
private var blurval:Number;
private var alphaval:Number;
private function main_enterframe(eo:* = null):void {
if(mdown) {
linesize += (linesize_max - linesize) * .02;
blurval = 4;
alphaval = 1;
}
else {
linesize += (linesize_min - linesize) * .1;
blurval = 10;
alphaval = .99;
}
colorhsv.h = colcnt;
addpnt.x += (_main.mouseX - addpnt.x) * .4;
addpnt.y += (_main.mouseY - addpnt.y) * .4;
var currentpnt = new Point();
currentpnt.x = addpnt.x;
currentpnt.y = addpnt.y;
_line.Draw(colorhsv.value, linesize, currentpnt, lastpnt);
lastpnt = currentpnt;
_canvas.lock();
_canvas.applyFilter( _canvas, _canvas.rect, new Point(), new BlurFilter(blurval, blurval, 1));
_canvas.colorTransform(_canvas.rect, new ColorTransform(1, 1, 1, alphaval, 0, 0, 0, 0));
_canvas.draw(_main, null, null);
_canvas.unlock();
}
/** */
private function main_enterframe_2(eo:* = null):void {
colcnt += 1;
if(colcnt > 360) colcnt -= 360;
}
}
}
package {
import flash.display.*;
import flash.events.*
import flash.geom.*;
public class line extends MovieClip {
//-------------------------------------------------------------------------------- Properties
private var _this:*;
//-------------------------------------------------------------------------------- Constractor
public function line() {
_this = this;
}
//-------------------------------------------------------------------------------- Function
/**
* draw
*/
public function Draw(col:uint, linesize:Number, currentpnt:Point, lastpnt:Point):void {
var g = _this.graphics;
g.clear();
g.beginFill(col, 1);
g.drawCircle(currentpnt.x, currentpnt.y, linesize / 2);
g.endFill();
g.lineStyle(linesize, col);
g.moveTo(currentpnt.x, currentpnt.y);
g.lineTo(lastpnt.x, lastpnt.y);
}
}
}