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

[1日1Wonderfl]3日目: 某的なアレ

1日1Wonderfl 3/30日目
某塊的なイントロ部分、どうやってるのかなー?って事で試してみた。
*  あと幾何学模様を書きたがってる人からインスパイアされたり。
*  まだまだ知らん事が山盛り。なるほど!の連続。楽しい :-)
*
*  @see http://katamari.co.jp/
*  @see http://tirirenge.undo.jp/?p=1676
// 1日1Wonderfl 3/30日目
/**
 *  某塊的なイントロ部分、どうやってるのかなー?って事で試してみた。
 *  あと幾何学模様を書きたがってる人からインスパイアされたり。
 *  まだまだ知らん事が山盛り。なるほど!の連続。楽しい :-)
 *
 *  @see http://katamari.co.jp/
 *  @see http://tirirenge.undo.jp/?p=1676
 */
package
{
    import flash.display.BlendMode;
    import flash.display.Graphics;
    import flash.display.Shape;
    import flash.display.Sprite;
    //import flash.display.StageAlign;
    //import flash.display.StageQuality;
    //import flash.display.StageScaleMode;
    import flash.events.Event;

    import com.flashdynamix.utils.SWFProfiler;

    import frocessing.color.ColorHSV;

    [SWF(width=465, height=465, frameRate=30, backgroundColor=0xffffff)]

    /**
     *  今回は丸を重ねましょう
     */
    public class Main extends Sprite
    {
        public static const NUM_CIRCLES:uint = 20;
        public static const MAX_DISTANCE:uint = 200;

        private var container:Sprite;
        private var circles:Array;

        /**
         *  コンストラクタ
         */
        public function Main()
        {
            //  ステージ上で (ry
            addEventListener(Event.ADDED_TO_STAGE, initialize);
        }

        /**
         *  初期化
         */
        private function initialize(evt:Event):void
        {
            //  立つ鳥後を濁さず
            removeEventListener(Event.ADDED_TO_STAGE, initialize);

            //  ステージの設定
            //stage.align = StageAlign.TOP_LEFT;
            //stage.quality = StageQuality.HIGH;
            //stage.scaleMode = StageScaleMode.NO_SCALE;

            //  プロファイラーを埋めこむ
            SWFProfiler.init(this);

            //  変数宣言とか
            var i:uint,
                cAngle:Number, nAngle:Number,
                hsv:ColorHSV,
                g:Graphics,
                sp:Shape;

            //  初期角度を 0 に
            cAngle = 0;

            //  360度(のラジアン)を丸の個数で割って、
            //  一個あたりの角度を計算しておく
            nAngle = Math.PI * 2 / NUM_CIRCLES;

            //  HSV 色空間での色定義
            //  @see http://ja.wikipedia.org/wiki/HSV%E8%89%B2%E7%A9%BA%E9%96%93
            hsv = new ColorHSV(cAngle, 1, .5, .2);

            //  ラップ用の Sprite を作る
            container = addChild(new Sprite()) as Sprite;
            container.x = stage.stageWidth / 2;
            container.y = stage.stageHeight / 2;

            //  丸を入れとくための配列を初期化
            circles = [];

            //  指定個分だけ丸を作る
            for (i=0; i<NUM_CIRCLES; i++)
            {
                //  とりあえず Shape 作って
                sp = new Shape();

                //  blendMode を SUBTRACT に設定
                //  @see http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/flash/display/BlendMode.html#SUBTRACT
                sp.blendMode = BlendMode.SUBTRACT;

                //  addChild より addChlidAt の方が速いと聞いて
                container.addChildAt(sp, 0);

                //  配列につっこんでおく
                circles[i] = sp;

                //  場所にあった色を設定
                hsv.h = cAngle / Math.PI * 180;

                //  丸を書く
                g = sp.graphics;
                g.beginFill(hsv.value, hsv.a);
                g.drawCircle(0, 0, 100);
                g.endFill();

                //  次の角度に更新
                cAngle += nAngle;
            }

            //  イベントを設定
            addEventListener(Event.ENTER_FRAME, step);
        }

        /**
         *  毎フレーム呼ばれる処理
         */
        public function step(evt:Event):void
        {
            var i:uint,
                r:int, length:Number,
                cAngle:Number, nAngle:Number,
                sp:Shape;

            //  コンテナを回して角度を取りだす
            r = container.rotation += 2;

            //  コンテナの角度から距離を計算
            length = Math.sin(r / 180 * Math.PI) * MAX_DISTANCE;

            //  初期角度を 0 に
            cAngle = 0;

            //  一個あたりの角度を計算
            nAngle = Math.PI * 2 / NUM_CIRCLES;

            //  指定個分回して配置を更新
            for (i=0; i<NUM_CIRCLES; i++)
            {
                sp = circles[i];
                sp.x = Math.cos(cAngle) * length;
                sp.y = Math.sin(cAngle) * length;

                cAngle += nAngle;
            }
        }
    }
}