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: flash on 2009-6-6

Get Adobe Flash player
by amane 13 Aug 2013
    Embed
/**
 * Copyright amane ( http://wonderfl.net/user/amane )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/fG21G
 */

package  
{
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.ui.Mouse;

    [SWF(backgroundColor = "0x000000", frameRate = "24")]
    public class NewClass extends Sprite    {
        //メンバ変数
        private var m_iCount:int = 1000;                    //カウント
        private var m_aBall:Array;                        //Ballオブジェクト格納用配列
        private var m_nBounce:Number = -1;                    //跳返り
        private var m_nFriction:Number = 0.95;                //摩擦
        private var m_nTargetX:Number = stage.stageWidth / 2;                      //目標地点X
        private var m_nTargetY:Number = stage.stageHeight / 2;                      //目標地点Y
        private var m_oSprite:Sprite;                                            //base
        private var m_nSpring:Number = 0.001;                    //バネ
        private var m_nSpringLngth:Number = 60;                //バネの元の長さ
        private var m_nRefRight:Number = 0;                                      //壁(右)
        private var m_nRefLeft:Number = 0;                                       //壁(左)
        private var m_nRefBottom:Number = 0;                                     //壁(下)
        private var m_nRefTop:Number = 0;                                        //壁(上)
        
        
        //コンストラクタ
        public function NewClass() 
        {
            init();
        }
        
        public function init():void{
            //ウィンドウサイズに合わせる
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            
            //Ball作成
            m_oSprite = new Sprite();
            m_aBall = new Array();
            
            for (var i:int = 0; i < m_iCount; i++){
                var oBall:Ball = new Ball(Math.random() * 10 , Math.random() * 0xffffff);
                //randomで初期配置
                oBall.x = Math.random() * stage.stageWidth;
                oBall.y = Math.random() * stage.stageHeight;
                
                //loop処理用に配列に保持
                m_aBall.push(oBall);
                
                oBall.addEventListener(MouseEvent.MOUSE_DOWN, onPress);
                m_oSprite.addChild(oBall);
            }
            addChild(m_oSprite);
            //イベントセット
            m_oSprite.addEventListener(Event.ENTER_FRAME, onEnterFrame);
            stage.addEventListener(MouseEvent.MOUSE_UP, onRelease);
            
        }
        
        public function onEnterFrame(event:Event):void {
            
            var iCount:int;        //Target指定用の数値
            
            //バネの動き
            for (var i:int = 0; i < m_iCount; i++) {
                //跳ね返り
                Reflection(m_aBall[i]);
                
                //Dragしていない要素をSpring
                iCount = i;
                if (!m_aBall[i].drag) {
                    for (var j:int = 0; j < m_iCount - 1; j++) {
                        if (iCount == m_iCount - 1) {
                            //配列番号クリア
                            iCount = -1;
                        }
                        SpringTo(m_aBall[i], m_aBall[iCount+1]);
                        iCount+=1;
                    }
                }
            }
            
            //線描画
            graphics.clear();
            graphics.lineStyle(1, 0xffffff);
            graphics.moveTo(m_aBall[0].x, m_aBall[0].y);
            for (var k:int = 1; k < m_iCount; k++) {
                graphics.lineTo(m_aBall[k].x, m_aBall[k].y);
            }
            graphics.lineTo(m_aBall[0].x, m_aBall[0].y);
            
        }
        
        private function onPress(event:MouseEvent):void {
            
            //drag開始
            event.target.startDrag();
            for (var i:int = 0; i < m_iCount; i++) {
                if (event.target == m_aBall[i]) {
                    m_aBall[i].drag = true;
                }
            }
            
        }
        
        private function onRelease(event:MouseEvent):void {
            
            //drag終了
            for (var i:int = 0; i < m_iCount; i++) {
                m_aBall[i].stopDrag();
                m_aBall[i].drag = false;
            }
            
        }
        
        private function Reflection(oBall:Ball):void {
            
            //壁の座標
            m_nRefRight = stage.stageWidth;
            m_nRefBottom = stage.stageHeight;
            m_nRefTop = 0;
            m_nRefLeft = 0;
            
            //横方向
            if (oBall.x + oBall.radius > m_nRefRight) {
                //境界線ぴったりに移動
                oBall.x = m_nRefRight - oBall.radius;
                //進行方向を逆にセット
                oBall.vx *= m_nBounce
            }else if (oBall.x - oBall.radius < m_nRefLeft) {
                oBall.x = m_nRefLeft + oBall.radius;
                oBall.vx *= m_nBounce
            }
            //縦方向
            if (oBall.y + oBall.radius > m_nRefBottom) {
                oBall.y = m_nRefBottom - oBall.radius;
                oBall.vy *= m_nBounce
            }else if (oBall.y - oBall.radius < m_nRefTop) {
                oBall.y = m_nRefTop + oBall.radius;
                oBall.vy *= m_nBounce
            }
        }
        
        private function SpringTo(oBall_a:Ball, oBall_b:Ball):void {
            
            //到達点を求める( oBall_bに対するoBall_aの到達点 )
            var nDistansX:Number = oBall_b.x - oBall_a.x;
            var nDistansY:Number = oBall_b.y - oBall_a.y;
            var nRadian:Number = Math.atan2(nDistansY, nDistansX);
            var nTargetX:Number = oBall_b.x - Math.cos(nRadian) * m_nSpringLngth;
            var nTargetY:Number = oBall_b.y - Math.sin(nRadian) * m_nSpringLngth;
            
            //バネ
            oBall_a.vx += (nTargetX - oBall_a.x) * m_nSpring;
            oBall_a.vy += (nTargetY - oBall_a.y) * m_nSpring;
            //摩擦
            oBall_a.vx *= m_nFriction;
            oBall_a.vy *= m_nFriction;
            //移動
            oBall_a.x += oBall_a.vx + 0.03;
            oBall_a.y += oBall_a.vy + 0.03;
            
        }
        
    }
    
}
    import flash.display.Sprite; 
    import flash.events.Event; 
    internal class Ball extends Sprite{ 
        //プロパティ 
        public var vx:Number = 0;                //速度X 
       public var vy:Number = 0;                //速度Y     
       public var radius:Number;                //半径 
        public var color:uint;                     //32 ビットの符号なし整数(intの 2 倍) 
        public var drag:Boolean;                    //Drag flg
         
        //コンストラクタ 
        public function Ball(nRadius:Number=40,uiColor:uint=0xff0000){ 
            this.radius = nRadius; 
            this.color = uiColor; 
            init(); 
        } 
         
        public function init():void{ 
            graphics.beginFill(color); 
            graphics.drawCircle(0,0,radius); 
            graphics.endFill(); 
        } 
    }