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: HASEN(ポップ)

import flash.display.LineScaleMode;

描画APIによるグラデーション線の描画方法のサンプル。
同じカラー、異なるアルファを使用することで、破線を生み出す
/**
 * Copyright nicholajs.borov ( http://wonderfl.net/user/nicholajs.borov )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/5ckK
 */

// forked from _53's HASEN(ポップ)
package {

    import flash.display.CapsStyle;
    import flash.display.GradientType;
    import flash.display.Shape;
    import flash.display.SpreadMethod;
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.geom.Matrix;
    import flash.geom.Point;

    // import flash.display.LineScaleMode;

    [SWF(backgroundColor=0x000000)]

    /**
    * 描画APIによるグラデーション線の描画方法のサンプル。
    * 同じカラー、異なるアルファを使用することで、破線を生み出す
    */
    public class Hasen extends Sprite {

        private var _currentShape:Shape;
        private var _color:uint;
        private var _startPosition:Point;

        /**
        * コンストラクタ。マウスイベントに関するリスナーを設定
        */
        public function Hasen() {
            stage.addEventListener(MouseEvent.MOUSE_DOWN, onStageMouseDown);
            stage.addEventListener(MouseEvent.MOUSE_UP, onStageMouseUp);
            stage.addEventListener(MouseEvent.DOUBLE_CLICK, onStageMouseDoubleClick);
        }

        /**
        * 開始位置から現在のマウス位置まで、グラデーション線を描画
        */
        private function drawLine():void {
            var thickness:Number = 40;

            // 同じカラー
            var colors:Array = [_color, 0xFFFFFF];
            // 異なるアルファ
            var alphas:Array = [1, 1];
            // 同じ比率、つまり透明度が即座に変わる
            var ratios:Array = [0, 255];


            // 開始位置と現在のマウス位置をもとに、線の角度を求める
            var currentPosition:Point = new Point(stage.mouseX, stage.mouseY);
            var xDist:Number = (currentPosition.x - _startPosition.x);
            var yDist:Number = (currentPosition.y - _startPosition.y);
            currentPosition.x-=_startPosition.x;
            currentPosition.y-=_startPosition.y;
            var angle:Number = Math.atan2(currentPosition.y, currentPosition.x);
            // 行列をグラデーションを回転させるために使用
            var matrix:Matrix = new Matrix();
            matrix.createGradientBox(currentPosition.length*2, currentPosition.length*2,angle,_startPosition.x-currentPosition.length,_startPosition.y-currentPosition.length);

            // グラデーション線の描画
            _currentShape.graphics.clear();
            _currentShape.graphics.lineStyle(thickness, 0, 1, false, null, CapsStyle.NONE);
            // nullの代わりに LineScaleMode.NONEを指定
            //_currentShape.graphics.lineStyle(thickness, 0, 1, false, LineScaleMode.NONE, CapsStyle.SQUARE);
            _currentShape.graphics.lineGradientStyle(GradientType.RADIAL, colors, alphas, ratios, matrix, SpreadMethod.PAD);
            _currentShape.graphics.moveTo(_startPosition.x, _startPosition.y);
            _currentShape.graphics.lineTo(stage.mouseX, stage.mouseY);
        }

        /**
        * ステージがクリックされたときのハンドラ。新しい線を描画するための新しいシェイプを追加し、
        * 線の開始位置を保持して、マウスの移動に関するリスナーを設定
        *
        * @param event ステージが送出するイベント
        */
        private function onStageMouseDown(event:MouseEvent):void {
            _color = Math.random()*0xFFFFFF;
            _currentShape = new Shape();
            addChild(_currentShape);
            _startPosition = new Point(stage.mouseX, stage.mouseY);
            stage.addEventListener(MouseEvent.MOUSE_MOVE, onStageMouseMove);
        }

        /**
        * マウスが放されたときのハンドラ。マウスの移動に関するリスナーを削除
        *
        * @param event ステージが送出するイベント
        */
        private function onStageMouseUp(event:MouseEvent):void {
            stage.removeEventListener(MouseEvent.MOUSE_MOVE, onStageMouseMove);
        }

        /**
        * マウスが移動するときのハンドラ。現在の線を更新
        *
        * @param event ステージが送出するイベント
        */
        private function onStageMouseMove(event:MouseEvent):void {
            drawLine();
            event.updateAfterEvent();
        }

        private function onStageMouseDoubleClick(event:MouseEvent):void{

        }

    }

}