スポンサーサイト

-------- | --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[ActionScript 3.0] 3Dカルーセル

2007-10-12 | 21:48

矢印アイコンをクリックし続けると加速します。

package {
    import flash.display.*;
    import flash.filters.*;
    import flash.events.*;
    import flash.utils.*;
 
    [SWF(width="600", height="400", backgroundColor="#ffffff")]
    public class Carousel extends Sprite{
        [Embed(source="lena.jpg")]
            private var myImage:Class;
        [Embed(source="right.png")]
            private var buttonRight:Class;
        [Embed(source="left.png")]
            private var buttonLeft:Class;

        private var bitmaps:Array = new Array();

        private var rad:Number = 0;
        private var a:Number = 0; // 角加速度
        private var v:Number = 0; // 角速度
        private var rz:Number = 0; // Z軸に対する角速度

        public function Carousel():void
        {
            stage.addEventListener(MouseEvent.MOUSE_OUT, function(e:MouseEvent):void{ v = 0; });
            for(var i:int = 0; i < 5 ; i++){
                var bm:Bitmap = new myImage();
                bm.filters = [new DropShadowFilter()];
                bitmaps.push(bm);
                addChild(bm);
            }

            createButton(50,300,"left", new buttonLeft());
            createButton(450,300,"right", new buttonRight());

            v = 0.1;

            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }

        private function onEnterFrame(e:Event):void{
            v += a;
            rz += 0.01;
            if(v > 0)
                v -= 0.0001;
            else if(v < 0)
                v += 0.0001;
//            if(Math.abs(v) < 0.002)
//               return;
            rad += v;
            var index:int = 0;
            for each(var bm:Bitmap in bitmaps){
                var thisRad:Number = 2*Math.PI/bitmaps.length * index + rad;
                thisRad %= Math.PI*2;
                var x:Number =  200*Math.sin(thisRad);
                if(Math.cos(thisRad) < 0){
                    setChildIndex(bm,0);
                } else{
                    setChildIndex(bm,bitmaps.length-1);
                }
                bm.scaleX = bm.scaleY = Math.cos(thisRad)/4.0 + 0.75;
                bm.alpha = bm.scaleY = Math.cos(thisRad)/4.0 + 0.75;
                var y:Number = 100*Math.cos(thisRad)/3;
                bm.x = Math.cos(rz)*x - Math.sin(rz)*y + 200;
                bm.y = Math.sin(rz)*x + Math.cos(rz)*y + 100;
                index++;
            }
        }

        private function createButton(x:int, y:int, name:String, b:DisplayObject):void{
            b.filters = [new DropShadowFilter()];
            var button:SimpleButton = new SimpleButton();
            button.x = x;
            button.y = y;
            button.name = name;
            button.upState = b;
            button.overState = button.upState;
            button.hitTestState = button.upState;
            addChild(button);
            button.addEventListener(MouseEvent.MOUSE_DOWN, onMouseClick);
            button.addEventListener(MouseEvent.MOUSE_UP, function(e:MouseEvent):void{
                    a = 0;
                    });
        }

        private function onMouseClick(e:MouseEvent):void{
            var button:SimpleButton = SimpleButton(e.target);
            if(button.name == "right"){
                a += 0.001;
            }else if(button.name == "left"){
                a -= 0.001;
            }
        }
    }
}

 
スポンサーサイト

Comment

Post a comment

Secret

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。