Юзаю box2dflash 2.1a, сделал тачку, но никак не могу правильно настроить амортизацию, выходит как то не естественно (колесики дергаются, не амортизируются нифига).

Код AS1/AS2:
package {
import flash.display.Bitmap;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import Box2D.Dynamics.*;
import Box2D.Collision.*;
import Box2D.Collision.Shapes.*;
import Box2D.Common.Math.*;
import Box2D.Dynamics.Joints.*;
import flash.utils.getDefinitionByName;
public class Car extends Sprite {
private const degreesToRadians:Number=0.0174532925;
//
//private var world:b2World=new b2World(new b2Vec2(0,10),true);
//private var worldScale:int=30;
public var physicsData:PhysicsData = new PhysicsData(); // создадим объект, который содержит данные о шейпах
public var car:b2Body;
public var leftWheelRevoluteJoint:b2RevoluteJoint;
public var rightWheelRevoluteJoint:b2RevoluteJoint;
private var left:Boolean=false;
private var right:Boolean=false;
public var motorSpeed:Number=0;
private var leftAxlePrismaticJoint:b2PrismaticJoint;
private var rightAxlePrismaticJoint:b2PrismaticJoint;
//
private var carPosX:Number=100;
private var carPosY:Number=200;
private var carWidth:Number=70;
private var carHeight:Number=10;
private var axleContainerDistance:Number=42;
private var axleContainerWidth:Number=15;
private var axleContainerHeight:Number=11;
private var axleContainerDepth:Number=15;
private var axleAngle:Number=20;
private var wheelRadius:Number=15;
private var bitmap:Bitmap;
private var _sprite:Sprite;
public function Car():void {
//debugDraw();
// ************************ THE FLOOR ************************ //
/*var floorShape:b2PolygonShape = new b2PolygonShape();
floorShape.SetAsBox(640/worldScale,10/worldScale);
var floorFixture:b2FixtureDef = new b2FixtureDef();
floorFixture.density=0;
floorFixture.friction=10;
floorFixture.restitution=0;
floorFixture.shape=floorShape;
var floorBodyDef:b2BodyDef = new b2BodyDef();
floorBodyDef.position.Set(320/worldScale,480/worldScale);
var floor:b2Body=world.CreateBody(floorBodyDef);
floor.CreateFixture(floorFixture);*/
// ************************ THE CAR ************************ //
var carShape:b2PolygonShape = new b2PolygonShape();
var carFixture:b2FixtureDef = new b2FixtureDef();
//carShape.SetAsBox(carWidth/PhysiVals.RATIO,carHeight/PhysiVals.RATIO);
carShape.SetAsArray(([ //неправильный многоугольник 1
b2Vec2.Make( -90 / PhysiVals.RATIO, 23 / PhysiVals.RATIO),
b2Vec2.Make( -90 / PhysiVals.RATIO, -9 / PhysiVals.RATIO),
b2Vec2.Make( -66 / PhysiVals.RATIO, -9 / PhysiVals.RATIO),
b2Vec2.Make( -45 / PhysiVals.RATIO, -29 / PhysiVals.RATIO),
b2Vec2.Make( 13 / PhysiVals.RATIO, -29 / PhysiVals.RATIO),
b2Vec2.Make( 42 / PhysiVals.RATIO, -5 / PhysiVals.RATIO),
b2Vec2.Make( 87 / PhysiVals.RATIO, 2 / PhysiVals.RATIO),
b2Vec2.Make( 85 / PhysiVals.RATIO, 23 / PhysiVals.RATIO),
]), 8);
var carFixture:b2FixtureDef = new b2FixtureDef();
carFixture.density=5;
carFixture.friction=3;
carFixture.restitution=0.3;
carFixture.filter.groupIndex=-1;
carFixture.shape = carShape;
var carBodyDef:b2BodyDef = new b2BodyDef();
carBodyDef.position.Set(carPosX/PhysiVals.RATIO,carPosY/PhysiVals.RATIO);
carBodyDef.type = b2Body.b2_dynamicBody;
// ************************ LEFT AXLE CONTAINER ************************ //
var leftAxleContainerShape:b2PolygonShape = new b2PolygonShape();
leftAxleContainerShape.SetAsOrientedBox(axleContainerWidth/PhysiVals.RATIO,axleContainerHeight/PhysiVals.RATIO,new b2Vec2(-axleContainerDistance/PhysiVals.RATIO,axleContainerDepth/PhysiVals.RATIO),axleAngle*degreesToRadians);
var leftAxleContainerFixture:b2FixtureDef = new b2FixtureDef();
leftAxleContainerFixture.density=3;
leftAxleContainerFixture.friction=5;
leftAxleContainerFixture.restitution=1;
leftAxleContainerFixture.filter.groupIndex=-1;
leftAxleContainerFixture.shape=leftAxleContainerShape;
// ************************ RIGHT AXLE CONTAINER ************************ //
var rightAxleContainerShape:b2PolygonShape = new
b2PolygonShape();
rightAxleContainerShape.SetAsOrientedBox(axleContainerWidth/PhysiVals.RATIO,axleContainerHeight/PhysiVals.RATIO,new b2Vec2(axleContainerDistance/PhysiVals.RATIO,axleContainerDepth/PhysiVals.RATIO),-axleAngle*degreesToRadians);
var rightAxleContainerFixture:b2FixtureDef = new
b2FixtureDef();
rightAxleContainerFixture.density=3;
rightAxleContainerFixture.friction=5;
rightAxleContainerFixture.restitution=1;
rightAxleContainerFixture.filter.groupIndex=-1;
rightAxleContainerFixture.shape=rightAxleContainerShape;
// ************************ MERGING ALL TOGETHER ************************ //
car=PhysiVals.universe.CreateBody(carBodyDef);
car.CreateFixture(carFixture);
_sprite = new Car_mc();
_sprite.x = car.GetPosition().x;
_sprite.y = car.GetPosition().y;
addChild(_sprite);
car.CreateFixture(leftAxleContainerFixture);
car.CreateFixture(rightAxleContainerFixture);
// ************************ THE AXLES ************************ //
var leftAxleShape:b2PolygonShape = new b2PolygonShape();
leftAxleShape.SetAsOrientedBox(axleContainerWidth/PhysiVals.RATIO/2,axleContainerHeight/PhysiVals.RATIO,new b2Vec2(0,0),axleAngle*degreesToRadians);
var leftAxleFixture:b2FixtureDef = new b2FixtureDef();
leftAxleFixture.density=3;
leftAxleFixture.friction=5;
leftAxleFixture.restitution=0;
leftAxleFixture.shape=leftAxleShape;
leftAxleFixture.filter.groupIndex=-1;
var leftAxleBodyDef:b2BodyDef = new b2BodyDef();
leftAxleBodyDef.type=b2Body.b2_dynamicBody;
var leftAxle:b2Body=PhysiVals.universe.CreateBody(leftAxleBodyDef);
leftAxle.CreateFixture(leftAxleFixture);
leftAxle.SetPosition(new b2Vec2(carPosX/PhysiVals.RATIO-axleContainerDistance/PhysiVals.RATIO-axleContainerHeight/PhysiVals.RATIO*Math.cos((90-axleAngle)*degreesToRadians),carPosY/PhysiVals.RATIO+axleContainerDepth/PhysiVals.RATIO+axleContainerHeight/PhysiVals.RATIO*Math.sin((90-axleAngle)*degreesToRadians)));
var rightAxleShape:b2PolygonShape = new b2PolygonShape();
rightAxleShape.SetAsOrientedBox(axleContainerWidth/PhysiVals.RATIO/2,axleContainerHeight/PhysiVals.RATIO,new b2Vec2(0,0),-axleAngle*degreesToRadians);
var rightAxleFixture:b2FixtureDef = new b2FixtureDef();
rightAxleFixture.density=3;
rightAxleFixture.friction=5;
rightAxleFixture.restitution=0;
rightAxleFixture.shape=rightAxleShape;
rightAxleFixture.filter.groupIndex=-1;
var rightAxleBodyDef:b2BodyDef = new b2BodyDef();
rightAxleBodyDef.type=b2Body.b2_dynamicBody;
var rightAxle:b2Body=PhysiVals.universe.CreateBody(rightAxleBodyDef);
rightAxle.CreateFixture(rightAxleFixture);
rightAxle.SetPosition(new b2Vec2(carPosX/PhysiVals.RATIO+axleContainerDistance/PhysiVals.RATIO+axleContainerHeight/PhysiVals.RATIO*Math.cos((90-axleAngle)*degreesToRadians),carPosY/PhysiVals.RATIO+axleContainerDepth/PhysiVals.RATIO+axleContainerHeight/PhysiVals.RATIO*Math.sin((90-axleAngle)*degreesToRadians)));
// ************************ THE WHEELS ************************ //;
var wheelShape:b2CircleShape=new
b2CircleShape(wheelRadius/PhysiVals.RATIO);
var wheelFixture:b2FixtureDef = new b2FixtureDef();
wheelFixture.density=3;
wheelFixture.friction=5;
wheelFixture.restitution=0.2;
wheelFixture.filter.groupIndex=-1;
wheelFixture.shape=wheelShape;
var wheelBodyDef:b2BodyDef = new b2BodyDef();
wheelBodyDef.type=b2Body.b2_dynamicBody;
wheelBodyDef.position.Set(carPosX/PhysiVals.RATIO-axleContainerDistance/PhysiVals.RATIO-2*axleContainerHeight/PhysiVals.RATIO*Math.cos((90-axleAngle)*degreesToRadians),carPosY/PhysiVals.RATIO+axleContainerDepth/PhysiVals.RATIO+2*axleContainerHeight/PhysiVals.RATIO*Math.sin((90-axleAngle)*degreesToRadians));
var leftWheel:b2Body=PhysiVals.universe.CreateBody(wheelBodyDef);
leftWheel.CreateFixture(wheelFixture);
wheelBodyDef.position.Set(carPosX/PhysiVals.RATIO+axleContainerDistance/PhysiVals.RATIO+2*axleContainerHeight/PhysiVals.RATIO*Math.cos((90-axleAngle)*degreesToRadians),carPosY/PhysiVals.RATIO+axleContainerDepth/PhysiVals.RATIO+2*axleContainerHeight/PhysiVals.RATIO*Math.sin((90-axleAngle)*degreesToRadians));
var rightWheel:b2Body=PhysiVals.universe.CreateBody(wheelBodyDef);
rightWheel.CreateFixture(wheelFixture);
// ************************ REVOLUTE JOINTS ************************ //
var leftWheelRevoluteJointDef:b2RevoluteJointDef=new b2RevoluteJointDef();
leftWheelRevoluteJointDef.Initialize(leftWheel,leftAxle,leftWheel.GetWorldCenter());
leftWheelRevoluteJointDef.enableMotor=true;
leftWheelRevoluteJoint=PhysiVals.universe.CreateJoint(leftWheelRevoluteJointDef) as b2RevoluteJoint;
leftWheelRevoluteJoint.SetMaxMotorTorque(10);
var rightWheelRevoluteJointDef:b2RevoluteJointDef=new b2RevoluteJointDef();
rightWheelRevoluteJointDef.Initialize(rightWheel,rightAxle,rightWheel.GetWorldCenter());
rightWheelRevoluteJointDef.enableMotor=true;
rightWheelRevoluteJoint=PhysiVals.universe.CreateJoint(rightWheelRevoluteJointDef) as b2RevoluteJoint;
rightWheelRevoluteJoint.SetMaxMotorTorque(10);
// ************************ PRISMATIC JOINTS ************************ //
var leftAxlePrismaticJointDef:b2PrismaticJointDef=new b2PrismaticJointDef();
leftAxlePrismaticJointDef.lowerTranslation=0;
leftAxlePrismaticJointDef.upperTranslation=axleContainerDepth/PhysiVals.RATIO;
leftAxlePrismaticJointDef.enableLimit=true;
leftAxlePrismaticJointDef.enableMotor=true;
leftAxlePrismaticJointDef.Initialize(car,leftAxle,leftAxle.GetWorldCenter(), new b2Vec2(-Math.cos((90-axleAngle)*degreesToRadians),Math.sin((90-axleAngle)*degreesToRadians)));
leftAxlePrismaticJoint=PhysiVals.universe.CreateJoint(leftAxlePrismaticJointDef) as b2PrismaticJoint;
leftAxlePrismaticJoint.SetMaxMotorForce(30);
leftAxlePrismaticJoint.SetMotorSpeed(10);
var rightAxlePrismaticJointDef:b2PrismaticJointDef=new b2PrismaticJointDef();
rightAxlePrismaticJointDef.lowerTranslation=0;
rightAxlePrismaticJointDef.upperTranslation=axleContainerDepth/PhysiVals.RATIO;
rightAxlePrismaticJointDef.enableLimit=true;
rightAxlePrismaticJointDef.enableMotor=true;
rightAxlePrismaticJointDef.Initialize(car,rightAxle,rightAxle.GetWorldCenter(), new b2Vec2(Math.cos((90-axleAngle)*degreesToRadians),Math.sin((90-axleAngle)*degreesToRadians)));
rightAxlePrismaticJoint=PhysiVals.universe.CreateJoint(rightAxlePrismaticJointDef) as b2PrismaticJoint;
rightAxlePrismaticJoint.SetMaxMotorForce(20);
rightAxlePrismaticJoint.SetMotorSpeed(10);
//addEventListener(Event.ENTER_FRAME,updateWorld);
//stage.addEventListener(KeyboardEvent.KEY_DOWN,keyPressed);
//stage.addEventListener(KeyboardEvent.KEY_UP,keyReleased);
}
private function keyPressed(e:KeyboardEvent):void {
switch (e.keyCode) {
case 37 :
left=true;
break;
case 39 :
right=true;
break;
}
}
private function keyReleased(e:KeyboardEvent):void {
switch (e.keyCode) {
case 37 :
left=false;
break;
case 39 :
right=false;
break;
}
}
public function updateMyLook():void
{
_sprite.x = car.GetPosition().x * PhysiVals.RATIO;
_sprite.y = car.GetPosition().y * PhysiVals.RATIO;
_sprite.rotation = car.GetAngle() * 180 / Math.PI;
}
}
}