Beautifl - Flash Gallery

Preview

QuickBox2D練習
paq 2010年1月24日 MIT License
?
      package 
{
    import Box2D.Common.Math.b2Vec2;
    import Box2D.Dynamics.Joints.b2RevoluteJoint;
    import com.actionsnippet.qbox.*;
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.geom.Matrix;
    
    [SWF(width = 465, height = 465, backgroundColor = 0x333333, frameRate = 60)]
    public class Main extends MovieClip
    {
        private var sim:QuickBox2D;
        private var canvas:MovieClip;
        private var dx:Number = 0;
        private var dy:Number = 0;
        private var time:Number = 0;
        private var scale:Number = 1;
        private var scaleDest:Number = 1.0;
        private var currQuick:QuickObject;
        private var xx:Number = 0;
        private var yy:Number = 0;
        
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            
            canvas = new MovieClip();
            addChild(canvas);
            
            sim = new QuickBox2D(canvas, {debug:true});
            //sim.worldAABB.upperBound = new b2Vec2(3000, 20);
            
            sim.addBox( { x:50, y:15.5, width:100, height:1, density:0 } );
            sim.addBox( { x:60, y:15.5, width:10, height:1, angle:-0.5, density:0 } );
            
            var body:QuickObject = sim.addBox( { x:2.5, y:13, width:4, height:1 } );
            var wheelA:QuickObject = sim.addCircle( { x:1, y:14, radius:0.5 } );
            var wheelB:QuickObject = sim.addCircle( { x:4, y:14, radius:0.5 } );
            sim.setDefault({type:"revolute", enableMotor:true, maxMotorTorque:250});
            var jointA:b2RevoluteJoint = sim.addJoint( { a:body.body, b:wheelA.body, x1:wheelA.x, y1:wheelA.y } ).joint as b2RevoluteJoint;
            var jointB:b2RevoluteJoint = sim.addJoint( { a:body.body, b:wheelB.body, x1:wheelB.x, y1:wheelB.y } ).joint as b2RevoluteJoint;
            jointA.SetMotorSpeed(5);
            jointB.SetMotorSpeed(5);
            sim.setDefault({});
            
            currQuick = body;
            
            var domino:Array = []
            for (var i:int = 0; i < 20; i++) 
            {
                domino.push(sim.addBox( { x:20 + i, y:14, width:0.15, height:1+i*0.1 } ));
            }
            
            var ball:QuickObject = sim.addCircle( { x:50, y:15.5, radius:1, restitution:2 } );
            
            sim.addTimeStepSequence({ time:240, callback:camera, args:[domino[0], 1.5] },
                                    { time:480, callback:camera, args:[domino[4], 0.7, 0, -130] },
                                    { time:700, callback:camera, args:[body, 1] },
                                    { time:930, callback:camera, args:[ball, 1.2] }
                                    );
                                    
            sim.start();
            sim.mouseDrag();
            
            addEventListener(Event.ENTER_FRAME, loop);
            loop()
        }
        
        private function loop(e:Event = null):void 
        {
            scale += (scaleDest - scale) * 0.2;
            dx += (currQuick.x * 30+xx - dx) * 0.2;
            dy += (currQuick.y * 30+yy - dy) * 0.2;
            var m:Matrix = canvas.transform.matrix;
            m.identity();
            m.translate(-dx+100,-dy+200);
            m.scale(scale, scale);
            canvas.transform.matrix = m;
        }   
        
        private function camera(quickObj:QuickObject, scale:Number = -1, x:Number = 0, y:Number = 0):void
        {
            currQuick = quickObj;
            xx = x;
            yy = y;
            if (scale != -1){
                scaleDest = scale;
            }
        }
        
    }
    
}