スポンサーサイト

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

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

[ActionScript 3.0] 無題

2007-08-09 | 21:15

作っている途中で何をやりたかったのかわからなくなったのですが、捨てるのもなんなのでアップしておきます。

package {
    import flash.display.*;
    import flash.events.*;
 
    [SWF(width="400", height="400", backgroundColor="#ffffff")]
    public class Rotate extends Sprite{
        private var circle:Shape = new Shape();

        private var satellites:Array;

        public function Rotate():void
        {
            var colors:Array = [0xff0000, 0x00ff00, 0x0000ff, 0xffff00, 0x00ffff, 0xff00ff,
                0xf8f00f, 0x00fff0, 0x000fff, 0x8f000f, 0xf0ff00, 0xf0f0ff,
                0xfff08f, 0xf00ff0, 0xf80f0f, 0xff0f0f, 0xf0ff0f, 0xff80ff,
                0xf0f0ff, 0x00f8ff, 0x000fff, 0xff000f, 0xf0ff00, 0xf0fff8];
            satellites = new Array();

            for(var i:int = 0 ; i < 24 ; i++){
                var satellite:Satellite = new Satellite();
                satellite.px = (i+1) * 15 * Math.tan(Math.PI/6);
                satellite.py = (i+1) * 15;
                satellite.pz = 0;
                satellite.ry = 0.1 * Math.random() * Math.pow(-1,-i % 2);
                satellite.color = colors[i];
                satellites.push(satellite);
                addChild(satellite);

            }

            stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }

        private function onEnterFrame( event:Event ):void
        {
            graphics.clear();
            graphics.lineStyle( 1, 0x000000 , 0.1);
            for each(var satellite:Satellite in satellites){
                satellite.rotate();
                satellite.x = satellite.px + 200;
                satellite.y = satellite.py ;

                // (0,200,-200)からの距離
                var distance:Number =
                    Math.sqrt(Math.pow(satellite.px,2) +
                            Math.pow(satellite.py-200,2) +
                            Math.pow(satellite.pz+200,2));

                // 距離に応じてスケールを変更
                satellite.scaleX = satellite.scaleY = (400 - distance)/100;

                graphics.moveTo(200,0);
                graphics.lineTo(satellite.x,satellite.y);
            }

            satellites.sort(sortZ);

            var i:int = 0;
            for each(var s:Satellite in satellites){
                setChildIndex(s, i++);
            }
        }

        private function sortZ(lhs:Satellite, rhs:Satellite):int
        {
            return rhs.pz - lhs.pz;
        }
    }
}

package {
    import flash.display.*;
    import flash.events.*;
 
    public class Satellite extends Sprite{
        // 位置
        public var px:Number=50;
        public var py:Number=80;
        public var pz:Number=100;

        // 回転角
        public var rx:Number=0.00;
        public var ry:Number=0.00;
        public var rz:Number=0.00;

        public function Satellite(){
            graphics.lineStyle( 1, 0x000000 );
            graphics.beginFill( 0xff0000 );
            graphics.drawCircle( 0, 0, 5 );
            graphics.endFill( );
        }

        public function rotate():void{
            rotateX(rx);
            rotateY(ry);
            rotateZ(rz);
        }

        public function rotateX(rad:Number):void{
            var x:Number = px;
            var y:Number = py;
            var z:Number = pz;
            px = x;
            py = y * Math.cos(rad) + z * Math.sin(rad);
            pz = y * -Math.sin(rad) + z * Math.cos(rad);
        }
        public function rotateY(rad:Number):void{
            var x:Number = px;
            var y:Number = py;
            var z:Number = pz;
            px = x * Math.cos(rad) + z * -Math.sin(rad);
            py = y;
            pz = x * Math.sin(rad) + z * Math.cos(rad);
        }
        public function rotateZ(rad:Number):void{
            var x:Number = px;
            var y:Number = py;
            var z:Number = pz;
            px = x;
            py = y * Math.cos(rad) + z * Math.sin(rad);
            pz = y * -Math.sin(rad) + z * Math.cos(rad);
        }

        public function set color(c:Number):void{
            graphics.lineStyle( 1, 0, 0.05 );
            graphics.beginFill( c );
            graphics.drawCircle( 0, 0, 5 );
            graphics.endFill( );
        }
    }
}
スポンサーサイト

Comment

Post a comment

Secret

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