スポンサーサイト

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

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

[ActionScript 3.0]apeを使った、サイクロイド曲線を球が転がるシミュレーション

2007-08-04 | 16:29

緑のボタンを押すと開始されます。
Fisixを使った、サイクロイド曲線を球が転がるシミュレーションと同様のことをapeを使ってやってみた。
package {
   
    import org.cove.ape.*;
   
    import flash.display.*;
   
    import flash.events.*;
       
    [SWF(width="650", height="500", backgroundColor="#ffffff")]
    public class ApeCycloid3 extends Sprite {
       
        private var tire:WheelParticle= new WheelParticle(140,10,14,false,2);
        private var tire2:WheelParticle= new WheelParticle(140,10,14,false,2);
        private var radius:Number = 150;
       
        public function ApeCycloid3() {
            var button:SimpleButton = new SimpleButton( );
            button.x = 200;
            button.y = 40;
            button.upState = createCircle( 0x00FF00, 30 );
            button.overState = createCircle( 0xFFFFFF, 32 );
            button.downState = createCircle( 0xCCCCCC, 30 );
            button.hitTestState = button.upState;
            button.addEventListener( MouseEvent.CLICK, onMouseDown );
            addChild( button );
           
            stage.frameRate = 55;
            addEventListener(Event.ENTER_FRAME, run);           
           
            APEngine.init(1/4);
            APEngine.container = this;
            APEngine.addMasslessForce(new Vector(0,4));
           
            APEngine.damping = .99;
            APEngine.constraintCollisionCycles = 10;
           
            tire.setStyle(1,0x999999,1,0x339999);
            tire.px = 10;
            tire.py = 0;
            var tireg:Group = new Group();
            tireg.addParticle(tire);
            APEngine.addGroup(tireg);

            var floors:Group = new Group();
           
            var x:Number;
            var y:Number;
            var x_old:Number = 0;
            var y_old:Number = 0;
            for(var t:Number = 0.1; t <= Math.PI; t +=0.03){
                x= (t - Math.sin(t))*radius;
                y= (1 - Math.cos(t))*radius;
                var rad:Number = Math.atan((y_old - y ) / (x - x_old))*(-1);
                var floor:RectangleParticle = new RectangleParticle(x,y,10,1,rad,true,1,0,0);
                floor.setStyle(1,0x999999,1,0x339999);
                floors.addParticle(floor);
                x_old = x;
                y_old = y;
            }
            trace(x);
            trace(y);
           
            APEngine.addGroup(floors);
            tireg.addCollidable(floors);

            tire2.setStyle(1,0x999999,1,0x339999);
            tire2.px = 10;
            tire2.py = 150;
            var tireg2:Group = new Group();
            tireg2.addParticle(tire2);
            APEngine.addGroup(tireg2);
            var floors2:Group = new Group();
            var len:Number = Math.sqrt(Math.pow(radius*Math.PI,2)+Math.pow(2*radius,2));
            trace(len);
            var floor2:RectangleParticle = 
				new RectangleParticle(radius*Math.PI/2,300,len,1,Math.atan(2/Math.PI),true,1,0,0);
            floor2.setStyle(1,0x999999,1,0x339999);
            floors2.addParticle(floor2);
            APEngine.addGroup(floors2);
            tireg2.addCollidable(floors2);
           
        }
       
        private function run(evt:Event):void {
           
            if(tire.px < radius*Math.PI){
                APEngine.step();
                APEngine.paint();
            }

        }
       
        private function onMouseDown(e:MouseEvent):void{
            trace("onMouseDown");

            tire.px = 10;
            tire.py = 0;
            tire2.px = 10;
            tire2.py = 150;
        }
        private function createCircle( color:uint, radius:Number ):Shape {
            var circle:Shape = new Shape( );
            circle.graphics.lineStyle( 1, 0x000000 );
            circle.graphics.beginFill( color );
            circle.graphics.drawCircle( 0, 0, radius );
            circle.graphics.endFill( );
            return circle;
        }
    }
}
スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。