forked from: Box2d wheeled car

by aobyrne
♥0 | Line 178 | Modified 2011-05-20 17:50:44 | MIT License
play

ActionScript3 source code

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

package {
    import flash.display.Sprite;
    import Box2D.Collision.*;// bounding box of our world
    import Box2D.Common.Math.*;// for vector(define gravity)
    import Box2D.Dynamics.*;// define bodies and define world
    import Box2D.Dynamics.Joints.*;
    import Box2D.Collision.Shapes.*;// define our shapes
    import flash.display.*;// sprite class
    import flash.events.*;
    import flash.ui.Keyboard;
 
    public class Box2DCar extends MovieClip {
        public var body:b2Body;
        public var leftWheel:b2Body;
        public var rightWheel:b2Body;
        public var leftRearWheel:b2Body;
        public var rightRearWheel:b2Body;
        public const MAX_STEER_ANGLE:Number = Math.PI/3;
        public const STEER_SPEED:Number = 1.5;
        public const SIDEWAYS_FRICTION_FORCE:Number = 10;
        public const HORSEPOWERS:Number = 40;
        public const CAR_STARTING_POS:b2Vec2 = new b2Vec2(10,10);
        public var engineSpeed:Number = 0;
        public var steeringAngle:Number = 0;
        public var myWorld:b2World;
        public var leftJoint:b2RevoluteJoint;
        public var rightJoint:b2RevoluteJoint;
        
        public function Box2DCar() {
            // write as3 code here..
            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;
            const leftRearWheelPosition:b2Vec2 = new b2Vec2(-1.5,1.90);
            const rightRearWheelPosition:b2Vec2 = new b2Vec2(1.5,1.9);
            const leftFrontWheelPosition:b2Vec2 = new b2Vec2(-1.5,-1.9);
            const rightFrontWheelPosition:b2Vec2 = new b2Vec2(1.5,-1.9);
            
            
            
            
            var worldBox:b2AABB = new b2AABB();
            worldBox.lowerBound.Set(-100,-100);
            worldBox.upperBound.Set(100,100);
             
            myWorld = new b2World(worldBox, new b2Vec2(0, 0) , true);
            myWorld.m_gravity
            trace( "myWorld.m_gravity : " + myWorld.m_gravity.x,', ',myWorld.m_gravity.y );
             
            //Create some static stuff
            var staticDef:b2BodyDef = new b2BodyDef();
            staticDef.position.Set(5,20);
            var staticBox:b2PolygonDef = new b2PolygonDef();
            staticBox.SetAsBox(5,5);
            myWorld.CreateBody(staticDef).CreateShape(staticBox);
            staticDef.position.x = 25;
            myWorld.CreateBody(staticDef).CreateShape(staticBox);
            staticDef.position.Set(15, 24);
            myWorld.CreateBody(staticDef).CreateShape(staticBox);
             
             
            // define our body
            var bodyDef:b2BodyDef = new b2BodyDef();
            bodyDef.linearDamping = 1;
            bodyDef.angularDamping = 1;
            bodyDef.position = CAR_STARTING_POS.Copy();
            bodyDef.allowSleep = false;
             
            body = myWorld.CreateBody(bodyDef);
            body.SetMassFromShapes();
             
            var leftWheelDef:b2BodyDef = new b2BodyDef();
            leftWheelDef.position = CAR_STARTING_POS.Copy();
            leftWheelDef.position.Add(leftFrontWheelPosition);
            //var leftWheel:b2Body = myWorld.CreateBody(leftWheelDef);
            leftWheel = myWorld.CreateBody(leftWheelDef);
             
            var rightWheelDef:b2BodyDef = new b2BodyDef();
            rightWheelDef.position = CAR_STARTING_POS.Copy();
            rightWheelDef.position.Add(rightFrontWheelPosition);
            //var rightWheel:b2Body = myWorld.CreateBody(rightWheelDef);
            rightWheel = myWorld.CreateBody(rightWheelDef);
             
            var leftRearWheelDef:b2BodyDef = new b2BodyDef();
            leftRearWheelDef.position = CAR_STARTING_POS.Copy();
            leftRearWheelDef.position.Add(leftRearWheelPosition);
            //var leftRearWheel:b2Body = myWorld.CreateBody(leftRearWheelDef);
            leftRearWheel = myWorld.CreateBody(leftRearWheelDef);
             
            var rightRearWheelDef:b2BodyDef = new b2BodyDef();
            rightRearWheelDef.position = CAR_STARTING_POS.Copy();
            rightRearWheelDef.position.Add(rightRearWheelPosition);
            //var rightRearWheel:b2Body = myWorld.CreateBody(rightRearWheelDef);
            rightRearWheel = myWorld.CreateBody(rightRearWheelDef);
             
            // define our shapes
            var boxDef:b2PolygonDef = new b2PolygonDef();
            boxDef.SetAsBox(1.5,2.5);
            boxDef.density = 1;
            body.CreateShape(boxDef);
             
            //Left Wheel shape
            var leftWheelShapeDef:b2PolygonDef = new b2PolygonDef();
            leftWheelShapeDef.SetAsBox(0.2,0.5);
            leftWheelShapeDef.density = 1;
            leftWheel.CreateShape(leftWheelShapeDef);
             
            //Right Wheel shape
            var rightWheelShapeDef:b2PolygonDef = new b2PolygonDef();
            rightWheelShapeDef.SetAsBox(0.2,0.5);
            rightWheelShapeDef.density = 1;
            rightWheel.CreateShape(rightWheelShapeDef);
             
            //Left Wheel shape
            var leftRearWheelShapeDef:b2PolygonDef = new b2PolygonDef();
            leftRearWheelShapeDef.SetAsBox(0.2,0.5);
            leftRearWheelShapeDef.density = 1;
            leftRearWheel.CreateShape(leftRearWheelShapeDef);
             
            //Right Wheel shape
            var rightRearWheelShapeDef:b2PolygonDef = new b2PolygonDef();
            rightRearWheelShapeDef.SetAsBox(0.2,0.5);
            rightRearWheelShapeDef.density = 1;
            rightRearWheel.CreateShape(rightRearWheelShapeDef);
             
            body.SetMassFromShapes();
            leftWheel.SetMassFromShapes();
            rightWheel.SetMassFromShapes();
            leftRearWheel.SetMassFromShapes();
            rightRearWheel.SetMassFromShapes();
             
            var leftJointDef:b2RevoluteJointDef = new b2RevoluteJointDef();
            leftJointDef.Initialize(body, leftWheel, leftWheel.GetWorldCenter());
            leftJointDef.enableMotor = true;
            leftJointDef.maxMotorTorque = 100;
             
            var rightJointDef:b2RevoluteJointDef = new b2RevoluteJointDef();
            rightJointDef.Initialize(body, rightWheel, rightWheel.GetWorldCenter());
            rightJointDef.enableMotor = true;
            rightJointDef.maxMotorTorque = 100;
             
            leftJoint = b2RevoluteJoint(myWorld.CreateJoint(leftJointDef));
            rightJoint = b2RevoluteJoint(myWorld.CreateJoint(rightJointDef));
             
            var leftRearJointDef:b2PrismaticJointDef = new b2PrismaticJointDef();
            leftRearJointDef.Initialize(body, leftRearWheel, leftRearWheel.GetWorldCenter(), new b2Vec2(1,0));
            leftRearJointDef.enableLimit = true;
            leftRearJointDef.lowerTranslation = leftRearJointDef.upperTranslation = 0;
             
            var rightRearJointDef:b2PrismaticJointDef = new b2PrismaticJointDef();
            rightRearJointDef.Initialize(body, rightRearWheel, rightRearWheel.GetWorldCenter(), new b2Vec2(1,0));
            rightRearJointDef.enableLimit = true;
            rightRearJointDef.lowerTranslation = rightRearJointDef.upperTranslation = 0;
             
            myWorld.CreateJoint(leftRearJointDef);
            myWorld.CreateJoint(rightRearJointDef);
             
             
            // debug draw
            var dbgDraw:b2DebugDraw = new b2DebugDraw();
            dbgDraw.m_sprite = new Sprite();
            addChild(dbgDraw.m_sprite);
            dbgDraw.m_drawScale = 20.0;
            dbgDraw.m_fillAlpha = 1;
            dbgDraw.m_lineThickness = 1.0;
            dbgDraw.m_drawFlags = b2DebugDraw.e_shapeBit |b2DebugDraw.e_centerOfMassBit;
            myWorld.SetDebugDraw(dbgDraw);
            
            
            
            stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed_handler);
            stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased_handler);
            
            parent.stage.addEventListener(Event.ENTER_FRAME, Update, false, 0 , true);
        }
        public function killOrthogonalVelocity(targetBody:b2Body):void {
            var localPoint:b2Vec2 = new b2Vec2(0,0);
            var velocity:b2Vec2 = targetBody.GetLinearVelocityFromLocalPoint(localPoint);
         
            var sidewaysAxis:b2Vec2 = targetBody.GetXForm().R.col2.Copy();
            sidewaysAxis.Multiply(b2Math.b2Dot(velocity,sidewaysAxis))
         
            targetBody.SetLinearVelocity(sidewaysAxis);//targetBody.GetWorldPoint(localPoint));
        }
        
        public function keyPressed_handler(e:KeyboardEvent):void {
            if (e.keyCode == Keyboard.UP) {
                body.WakeUp();
                engineSpeed = -HORSEPOWERS;
            }
            if(e.keyCode == Keyboard.DOWN){
                engineSpeed = HORSEPOWERS;
            }
            if(e.keyCode == Keyboard.RIGHT){
                steeringAngle = MAX_STEER_ANGLE
            }
            if(e.keyCode == Keyboard.LEFT){
                steeringAngle = -MAX_STEER_ANGLE
            }
        }
        
        public function keyReleased_handler(e:KeyboardEvent):void {
            if(e.keyCode == Keyboard.UP || e.keyCode == Keyboard.DOWN){
                engineSpeed = 0;
            } 
            if(e.keyCode == Keyboard.LEFT || e.keyCode == Keyboard.RIGHT){
                steeringAngle = 0;
            }
        }
        
         
        public function Update(e:Event):void {
            myWorld.Step(1/30, 10);
            killOrthogonalVelocity(leftWheel);
            killOrthogonalVelocity(rightWheel);
            killOrthogonalVelocity(leftRearWheel);
            killOrthogonalVelocity(rightRearWheel);
         
            //Driving
            var ldirection:b2Vec2 = leftWheel.GetXForm().R.col2.Copy();
            ldirection.Multiply(engineSpeed);
            var rdirection:b2Vec2 = rightWheel.GetXForm().R.col2.Copy();
            rdirection.Multiply(engineSpeed);
            leftWheel.ApplyForce(ldirection, leftWheel.GetPosition());
            rightWheel.ApplyForce(rdirection, rightWheel.GetPosition());
         
            //Steering
            var mspeed:Number;
            mspeed = steeringAngle - leftJoint.GetJointAngle();
            leftJoint.SetMotorSpeed(mspeed * STEER_SPEED);
            mspeed = steeringAngle - rightJoint.GetJointAngle();
            rightJoint.SetMotorSpeed(mspeed * STEER_SPEED);
        }
    }
}

Forked