In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

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);
            }
        }
    }
}