万華鏡の具だけ

by takishiki
kaleidoscope
* 万華鏡の具?が回るところのみ。
* ここまではそんなに無駄はない・・・のか?
* 
* 図形は毎回ランダム。
♥0 | Line 100 | Modified 2010-08-07 20:56:44 | MIT License
play

ActionScript3 source code

/**
 * Copyright takishiki ( http://wonderfl.net/user/takishiki )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/dJUs
 */

/*
 * kaleidoscope
 * 万華鏡の具?が回るところのみ。
 * ここまではそんなに無駄はない・・・のか?
 * 
 * 図形は毎回ランダム。
 */

package 
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.display.MovieClip;
    import com.actionsnippet.qbox.*;
    import Box2D.Common.Math.b2Vec2;
    import com.actionsnippet.qbox.QuickBox2D;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.ColorTransform;
    import flash.geom.Matrix;
    import flash.geom.Point;
    import flash.geom.Rectangle;
    import flash.text.TextField;
    import flash.display.BlendMode;
    import flash.display.Graphics;
    
    
    [SWF(width=465, height=465, frameRate=30, backgroundColor=0xFFFFFF)]
     public class Main extends MovieClip 
    {
        private const LEN:int = 100;
        private const NUM:int = 20;
        private const DEBUG:Boolean = false;
        
        private var _sp:Sprite;
        private var _sim:QuickBox2D;
        private var _deg:Number = 0;
        
        // 
        public function Main():void {
            stage.frameRate = 60;
            
            _sim = new QuickBox2D(this, { debug:DEBUG } );
            _sim.setDefault( { fillColor:0x000000, lineAlpha:0, radius:1.5 } );
            _sim.createStageWalls();
            
            var a:Number = stage.stageWidth / 4 / 30;
            
            _sim.addBox( { x:a, y:a * 2, width:0.5, height:a * 2, angle:0, density:0, fillColor:0x000000 } );
            _sim.addBox( { x:a * 3, y:a * 2, width:0.5, height:a * 2, angle:0, density:0, fillColor:0x000000 } );
            _sim.addBox( { x:a * 2, y:a, width:a * 2, height:0.5, angle:0, density:0, fillColor:0x000000 } );
            _sim.addBox( { x:a * 2, y:a * 3, width:a * 2, height:0.5, angle:0, density:0, fillColor:0x000000 } );
            
            _sim.gravity = new b2Vec2(0, 0);
            
            var type:int;
            var i:int;
            for (i = 0; i < NUM; i++) {
                type = randRange(0, 1);
                if (type == 0) {
                    _sim.addBox( {
                        x:stage.stageWidth / 30 / 2, y:stage.stageHeight / 30 / 2, 
                        width:randRange(1, 15) / 10, height:randRange(1, 15) / 10, 
                        fillColor:randRange(1, 0xFFFFFF), fillAlpha:randRange(5, 10) / 10, 
                        lineColor:randRange(0, 0), lineAlpha:0
                    } );
                    
                }else {
                    _sim.addCircle( { 
                        x:stage.stageWidth / 30 / 2, y:stage.stageHeight / 30 / 2, 
                        radius:randRange(1, 10) / 10,
                        fillColor:randRange(1, 0xFFFFFF), fillAlpha:randRange(5, 10) / 10, 
                        lineColor:randRange(0, 0), lineAlpha:0
                    } );
                }
            }
            
            _sim.start();
            _sim.mouseDrag();
            
            var r3:Number = Math.sqrt(3);
            
            var sp:Sprite = new Sprite();
            sp.graphics.beginFill(0x000000, 0.5);
            //sp.graphics.beginFill(0x000000, 1.0);
            sp.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
            drawPoly(sp, 3, stage.stageWidth / 2, stage.stageHeight / 2, LEN * 0.9 / 2 / r3 * 2, 30);
            sp.graphics.endFill();
            this.addChild(sp);
            
            this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }
        
        
        // draw shape
        private function drawPoly(sp:Sprite, num:int, x:int, y:int, r:int, deg:Number):void {
            /*
             * sp:対象Sprite
             * num:頂点の数
             * x:中心のx座標
             * y:中心のy座標
             * r:半径
             * deg:回転角度(度)
             */
            var g:Graphics = sp.graphics;
            var rad:Number;
            var i:int;
            var step:Number = 360 / num;
            
            // 描画スタート位置に移動
            rad = deg2rad(0 + deg);
            g.moveTo(x + r * Math.cos(rad), y + r * Math.sin(rad));
            
            for (i = 0; i < num; i++) {
                rad = deg2rad((i + 1) * step + deg);
                g.lineTo(x + r * Math.cos(rad), y + r * Math.sin(rad));
            }
        }
        
        
        // 
        private function onEnterFrame(event:Event):void {
            _deg += 1;
            if (_deg >= 360) {
                _deg -= 360;
            }
            var rad:Number = _deg / 180 * Math.PI;
            var s:Number = 20;
            _sim.gravity = new b2Vec2(s * Math.cos(rad), s * Math.sin(rad));
        }
        
        // degree -> radian
        private function deg2rad(deg:Number):Number {
            deg %= 360;
            return deg / 180 * Math.PI;
        }
        
        // a-bの乱数生成
        private function randRange(min:Number = 0, max:Number = 1):Number {
            var randomNum:Number = Math.floor(Math.random() * (max - min + 1)) + min;
            return randomNum;
        }
        
        
    }
    
}