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; } } } } QuickBox2D練習