forked from: forked from: forked from: QuickBox2D練習

by ohisama
♥0 | Line 84 | Modified 2013-02-26 12:47:20 | MIT License
play

ActionScript3 source code

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

// forked from 62316e's forked from: forked from: QuickBox2D練習
// forked from mitata's forked from: QuickBox2D練習
// forked from paq's QuickBox2D練習
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 : false});
            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 : 350});
            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 : 1.1});
            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;
            }
        }
    }
}