MetalRibbon?

by bradsedito forked from 二つのうねうね (diff: 40)
♥0 | Line 110 | Modified 2011-01-23 03:51:25 | MIT License
play

ActionScript3 source code

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

// forked from fumix's 二つのうねうね
package 
{
    import flash.display.Sprite;
    import flash.display.Stage;
    import flash.events.Event;
    import flash.filters.*;
    
[SWF(width = "465", height = "465", frameRate = "100", backgroundColor = "#ffffff")]

public class Main extends Sprite 
    {
    public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
            var r1:ribbon = new ribbon(false,0x000000,2);
            var r2:ribbon = new ribbon(true,0x999999,-2);
            var r3:ribbon = new ribbon(true,0xffffff,4); 
            r1.x = stage.stageWidth / 2 + 0 ;
            r2.x = stage.stageWidth / 2 + 0 ;   
            r3.x = stage.stageWidth / 2 + 0 ;
            r1.alpha = 01.00 ;
            r2.alpha = 00.90 ;
            r3.alpha = 00.60 ;
//            r1.rotationX = rotationX++;//
 //           r2.rotationX = rotationX+//+;
           r3.rotationY = rotationY++;
            addChild(r1)     ;
            addChild(r2)     ;
            addChild(r3)     ;
            
}}}

import flash.display.Sprite;
import flash.display.Stage;
import flash.events.Event;

class ribbon extends Sprite 
    {
        private const MAXNUMBER:int = 100;
        private const WIDTH:int = 50;
        
        private var widthPiece:Number;
        private var offsetX:Number;
        private var offsetY:Number;
        private var color:uint;
        
        private var rad1:Number;
        private var rad2:Number;
        private var drad1:Number;

        private var rollDirection:int;
        
        
        private var Sprites:Array;
        
        
        
        
        /**
         * ウネウネするリボン
         * @リボンの振り幅        _widthPiece
         * @x座標のオフセット    _offsetX
         * @y座標のオフセット    _offsetY
         * @y回転方向(右左)    _roll
         */
        public function ribbon(_roll:Boolean=true, _color:uint=0x000000,_widthPiece:Number=15,_offsetX:Number=0,_offsetY:Number=0):void 
        {
            //初期値設定
            if (_roll) rollDirection = 1;
            else rollDirection = -1;
            color = _color;
            widthPiece = _widthPiece;
            offsetX = _offsetX;
            offsetY = _offsetY;

            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
            
        }
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            
            //リボンの振りとうねりの開始角度を決定
            rad1 = Math.floor(Math.random() * 36) * 10;
            rad2 = Math.floor(Math.random() * 36) * 10;
            drad1 = 3; 

            //ダミースプライト生成
            var i1:Number = MAXNUMBER;
            Sprites = new Array();
            while (i1--) {
               Sprites.push({x:offsetX, y:((stage.stageHeight+30) /MAXNUMBER) *i1+offsetY - 15});
            }
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
            // entry point
        }

        /**
         * ループ処理
         * @param    e
         */
        private function onEnterFrame(e:Event):void 
        {
            headTrail();
            trail(0,MAXNUMBER, 0.9);
            drawPolygon();
        }
        
        
        /**
         * 最初のスプライトの動き
         */
        private function headTrail():void
        {
            rad1 += drad1;
            rad2 += 2;
            if(rad1 >360){
                rad1 = rad1 - 360;
                drad1 = Math.random()*4+2;//目標周期をランダムに決定(26
            }
            if(rad2 >360){
                rad2 = rad2 - 360;
            }
            Sprites[0].x = Math.sin(rollDirection*rad1 * Math.PI/180)*widthPiece+offsetX;
        }
        /**
         * 先頭の点以外の処理
         * @param    st
         * @param    end
         * @param    rate
         */
        private function trail(st:int,end:int,rate:Number):void
        {
            for (var i:int = (end - 1); i > st; i-- ) {
                Sprites[i].x = Sprites[(i - 1)].x;
            }
        }
        
        /**
         * ポリゴンの描写
         */
        private function drawPolygon():void
        {
            
            var i1:int = MAXNUMBER;
            graphics.clear();
            while (--i1) {
                graphics.beginFill(color);
                graphics.lineStyle(0, color, 1);
                var w1:Number = WIDTH*Math.cos(rollDirection*(rad2+i1*2+45) * Math.PI/180)/2;
                graphics.moveTo(Sprites[i1].x-w1, Sprites[i1].y-w1);
                graphics.lineTo(Sprites[i1].x + w1, Sprites[i1].y + w1);
                
                var w2:Number = WIDTH*Math.cos(rollDirection*(rad2+i1*2+45) * Math.PI/180)/2;
                graphics.lineTo(Sprites[(i1-1)].x+w2, Sprites[(i1-1)].y+w2);
                graphics.lineTo(Sprites[(i1-1)].x-w2, Sprites[(i1-1)].y-w2);
                graphics.lineTo(Sprites[i1].x-w1, Sprites[i1].y-w1);
                graphics.endFill();
            }            
        }
    }