forked from: ブラーフィルターでじわじわおえかき
---- Original comment by maxcaffy ----------------------
* ブラーフィルターさんの練習中。
* ドラッグ!ドラッグ!
* 一定のあたい以上黒いところからは白線になるよ!
* どうしても黒に白が負けてしまう現象をどうにかしたい
*
* ---- Additional comment by matacat ---------------------
* This is an exercise of BlurFilter.
* Drag! Drag!!
* While you drawing, inc runs gradually.
* Releasing mouse button makes it to flow.
* Try to press left or rigtht arrow key!
*
* 黒に白が負けてしまう現象の回避方法がわからなかったので、
* インクの色を黒に限定する方向で妥協です...すみません。
* ブラーフィルタの特性でしょうか?
* 描いている間はインクがじわじわにじんで、
* マウスボタンを離すとじわじわ消えていきます。
*
* *追記*
* 機能追加。左右キーを押してみよう。
*
* *追追記*
* 全く説明になってない注釈追加。全画面でお楽しみください。
// forked from maxcaffy's ブラーフィルターでじわじわおえかき
/*
* ---- Original comment by maxcaffy ----------------------
* ブラーフィルターさんの練習中。
* ドラッグ!ドラッグ!
* 一定のあたい以上黒いところからは白線になるよ!
* どうしても黒に白が負けてしまう現象をどうにかしたい
*
* ---- Additional comment by matacat ---------------------
* This is an exercise of BlurFilter.
* Drag! Drag!!
* While you drawing, inc runs gradually.
* Releasing mouse button makes it to flow.
* Try to press left or rigtht arrow key!
*
* 黒に白が負けてしまう現象の回避方法がわからなかったので、
* インクの色を黒に限定する方向で妥協です...すみません。
* ブラーフィルタの特性でしょうか?
* 描いている間はインクがじわじわにじんで、
* マウスボタンを離すとじわじわ消えていきます。
*
* *追記*
* 機能追加。左右キーを押してみよう。
*
* *追追記*
* 全く説明になってない注釈追加。全画面でお楽しみください。
*/
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Graphics;
import flash.display.Shape;
import flash.display.Sprite;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.filters.BlurFilter;
import flash.geom.ColorTransform;
import flash.geom.Matrix;
import flash.geom.Rectangle;
import flash.ui.Keyboard;
[SWF(backgroundColor = 0x606060)]
public class FlashTest extends Sprite
{
// 各種寸法
private const WZ:int = stage.stageWidth;
private const HI:int = stage.stageHeight;
// bleed, buffer の一辺の長さ
private const SIDE:int = Math.sqrt(WZ * WZ + HI * HI) + 2;
// display を buffer に描画する時ピクセルをずらす
private var translate:Matrix = new Matrix(1, 0, 0, 1, (SIDE - WZ) / 2, (SIDE - HI) / 2);
// 線を描くところ
private var canvas:Shape = new Shape();
private var g:Graphics = canvas.graphics;
// インクがにじむところ
private var bleed:BitmapData = new BitmapData(SIDE, SIDE, true);
private var buffer:BitmapData = bleed.clone();
private var blur:BlurFilter = new BlurFilter(2, 2, 2);
// bleed の中心を回転の中心にするため、別の DisplayObjectContainer に入れる
private var rotator:Sprite = new Sprite();
// 漂白剤
private var bleach:ColorTransform = new ColorTransform(1, 1, 1, 1, 1, 1, 1);
// 表示系
private var display:Sprite = new Sprite();
private var debug:Sprite = new Sprite();
private var degree:FadeoutTF = new FadeoutTF();
public function FlashTest()
{
stage.scaleMode = StageScaleMode.NO_SCALE;
var b:Bitmap = new Bitmap(bleed);
b.x = -b.width / 2;
b.y = -b.height / 2;
rotator.addChild(b);
rotator.x = WZ / 2;
rotator.y = HI / 2;
display.addChild(rotator);
display.addChild(canvas);
setDebug();
addChild(display);
addChild(debug);
stage.addEventListener(Event.ENTER_FRAME, _enterFrame);
stage.addEventListener(MouseEvent.MOUSE_UP, _mouseUp);
stage.addEventListener(MouseEvent.MOUSE_DOWN, _mouseDown);
stage.addEventListener(KeyboardEvent.KEY_DOWN, _keyDown);
}
private function _enterFrame(event:Event):void
{
buffer.draw(display, translate, bleach);
bleed.applyFilter(buffer, buffer.rect, buffer.rect.topLeft, blur);
}
private function _mouseUp(event:MouseEvent):void
{
stage.removeEventListener(MouseEvent.MOUSE_MOVE, _mouseMove);
g.clear();
}
private function _mouseDown(event:MouseEvent):void
{
g.lineStyle(5, 0x000000);
g.moveTo(event.stageX, event.stageY);
stage.addEventListener(MouseEvent.MOUSE_MOVE, _mouseMove);
}
private function _mouseMove(event:MouseEvent):void
{
g.lineTo(event.stageX, event.stageY);
}
private function _keyDown(event:KeyboardEvent):void
{
switch(event.keyCode) {
case Keyboard.RIGHT: rotator.rotation += 0.5; break;
case Keyboard.LEFT: rotator.rotation -= 0.5; break;
}
degree.text = rotator.rotation.toFixed(1);
}
// 以下ぐっちゃぐちゃ
private function setDebug():void
{
var rt:Rectangle = rotator.getRect(stage);
var g:Graphics = debug.graphics;
g.lineStyle(2, 0xFF0000, 0.3, true);
var st:FadeoutTF = new FadeoutTF();
st.text = "stage";
st.x = WZ - st.width;
st.y = HI;
debug.addChild(st);
g.drawRect( -1, -1, WZ + 2, HI + 2);
var bf:FadeoutTF = new FadeoutTF("right", 0xFFFFFF);
bf.text = "buffer";
bf.x = SIDE - bf.width;
bf.y = rt.bottom - bf.height;
debug.addChild(bf);
g.drawRect( -1, -1, SIDE + 2, SIDE + 2);
var bl:FadeoutTF = new FadeoutTF();
bl.text = "bleed";
bl.x = rt.right - bl.width;
bl.y = rt.bottom - bl.height;
debug.addChild(bl);
g.drawRect(rt.top - 1, rt.left - 1, SIDE + 2, SIDE + 2);
var tr:FadeoutTF = new FadeoutTF("left");
tr.text = "↑\ntranslate における ty\n(SIDE - HI) / 2\n↓"
tr.y = (HI + rt.bottom) / 2 - tr.height / 2;
debug.addChild(tr);
degree.text = " ";
degree.x = WZ - degree.width;
degree.y = HI - degree.height;
debug.addChild(degree);
}
}
}
import flash.events.Event;
import flash.text.TextField;
import flash.text.TextFormat;
class FadeoutTF extends TextField
{
private var fc:int;
private var fr:Number;
private var iv:Number;
public function FadeoutTF(autoSize:String = "right", color:uint = 0x000000):void
{
defaultTextFormat = new TextFormat(null, null, color);
this.autoSize = autoSize;
selectable = false;
}
override public function set text(str:String):void
{
super.text = str;
if (stage) {
fc = 0;
fr = stage.frameRate;
iv = 1 / fr;
alpha = 1;
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
}
private function onEnterFrame(e:Event):void
{
if (++fc > fr) {
if ((alpha -= iv) <= 0) {
removeEventListener(Event.ENTER_FRAME, onEnterFrame);
}
}
}
}