Beautifl - Flash Gallery

Thumbnail : わかめペン簡易版
わかめペン簡易版
trick7 2009-08-27 All rights reserved

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

// forked from trick7's code on 2008-12-18
package  {
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.BlendMode;
	import flash.display.Sprite;
	import flash.filters.ColorMatrixFilter;
	import flash.filters.ConvolutionFilter;
	import flash.filters.DisplacementMapFilter;
	import flash.geom.ColorTransform;
	import flash.geom.Matrix;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	[SWF(backgroundColor="0x000000", frameRate="60")]
	public class WakamePenWonderFl extends Sprite{
		private var _sp:Sprite;
		private var _drawingBoard:Sprite;
		private var _drawingStockBMD:BitmapData;
		private var _drawingStock:Bitmap;
		private var _baseBmpd:BitmapData;
		private var _viewBm:Bitmap;
		private var _displaceImage:BitmapData;
		private var _clrMatrix:ColorMatrixFilter;
		private var _seed:Number = Math.random();
		private var _offsets:Array = [new Point(), new Point()];
		private var _mousedown:Boolean = false;
		public function WakamePenWonderFl() {
			_sp = new Sprite();
			_drawingBoard = new Sprite();
			//ペンの太さと初期色
			_drawingBoard.graphics.lineStyle(5, 0x00ffffff);
			
			addChild(_sp);
			addEventListener(Event.ENTER_FRAME, run);
			stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDownListener);
			stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUpListener);
			
			//描画スプライトのストック用ビットマップ。背景はアルファ0
			_drawingStockBMD =  new BitmapData(stage.stageWidth, stage.stageHeight, true, 0x00000000);
			_drawingStock = new Bitmap(_drawingStockBMD);
			_sp.addChild(_drawingStock)
			_sp.addChild(_drawingBoard);
			
			//表示用bitmap
			_baseBmpd = new BitmapData(stage.stageWidth, stage.stageHeight, false, 0xff000000);
			_viewBm = new Bitmap(_baseBmpd,"auto",true);
			_viewBm.blendMode = BlendMode.SCREEN;
			addChild(_viewBm);
			
			_displaceImage = new BitmapData(stage.stageWidth, stage.stageHeight, false, 0xFFFFFFFF);
			
			
			//消去ボタン
			var btn:Sprite = new Sprite();
			btn.graphics.beginFill(0x666666);
			btn.graphics.drawCircle(20, 20, 15);
			btn.buttonMode = true;
			addChild(btn);
			btn.addEventListener(MouseEvent.CLICK, onEraceListener);
		}
		private function run(e:Event):void {
			if (_mousedown) {
				_drawingBoard.graphics.lineStyle(5,Math.random()*0xffffff)
				_drawingBoard.graphics.lineTo(mouseX, mouseY);
			}
			//置き換えマップを動かす。
			for(var i:int = 0; i < 2; ++i){
				_offsets[i].x += 5; //X方向
				_offsets[i].y += 1; //Y方向
			}
			//もやもやした白黒画像を生成
			_displaceImage.perlinNoise(50, 80, 1, _seed, false, true, 1, true, _offsets);
			
			var f:DisplacementMapFilter = new DisplacementMapFilter(_displaceImage, null, 1, 1, 10, 20, "color", 0x0);
			//displacementMapFilter
			_baseBmpd.applyFilter(_baseBmpd,new Rectangle(0,0,_baseBmpd.width,_baseBmpd.height),new Point(0,0),f);
			//convolutionFilter
			_baseBmpd.applyFilter(_baseBmpd,new Rectangle(0,0,_baseBmpd.width,_baseBmpd.height),new Point(0,0),set_cf());
			
			//描画(ここをコメントアウトするとわかめフィルタ効果をオフにできる。完全に切るときは上の該当処理も消すこと。)
			_baseBmpd.draw(_sp);
		}
		private function set_cf():ConvolutionFilter{//ConvolutionFilter
		
		var m1:Number = 1; var m2:Number = 0; var m3:Number = 0; 
		var m4:Number = 1; var m5:Number = 1; var m6:Number = 1;
		var m7:Number = 0; var m8:Number = 0; var m9:Number = 0;
		var ma:Number = .3;
		var mt:Number = m1 + m2 +m3 + m4 +m5 + m6 +m7 + m8 +m9 + ma;
		
		var cf:ConvolutionFilter = new ConvolutionFilter(3,3,														[m1,m2,m3,															 m4,m5,m6,														 m7,m8,m9														 ],mt,0,false);
																 
			return cf;
		}
		private function onMouseDownListener(event:MouseEvent):void {
			_mousedown = true;
			//ペン先を移動。+1しているのは点が描けるようにする処理
			_drawingBoard.graphics.moveTo(mouseX, mouseY+1 ); 
		}
		private function onMouseUpListener(event:MouseEvent):void {
			_mousedown = false;
			//lineTo で描画されたグラフィックをキャプチャ
			_drawingStockBMD.draw(_drawingBoard);
			//キャプチャ後、ラインは不要なのでクリアしておく
			_drawingBoard.graphics.clear();
		}
		private function onEraceListener(event:MouseEvent):void {
			//キャプチャ用ビットマップをクリア
			_drawingStockBMD.fillRect(new Rectangle(0,0,stage.stageWidth, stage.stageHeight),0x000000);
			_drawingBoard.graphics.clear();
		}
	}
}