by Emanuele Feronato 译:童年
入门篇范例效果:
https://dl-web.dropbox.com/get/%E5%85%A5%E9%97%A8.swf?w=ea1c91c1
网速慢打不开的话走这里--下载链接:
https://www.dropbox.com/s/t2le0d4mjyqi74m/%E5%85%A5%E9%97%A8.swf
package { import flash.display.Sprite; import flash.events.Event; import Box2D.Dynamics.*; import Box2D.Collision.*; import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; public class Main extends Sprite { public var world:b2World=new b2World(new b2Vec2(0,10.0),true); public var worldScale:int=30; public function Main():void { debugDraw(); draw_box(250,300,500,100,false); draw_box(250,100,100,100,true); draw_circle(100,100,50,false); draw_circle(400,100,50,true); addEventListener(Event.ENTER_FRAME, update); } public function draw_circle(px:Number, py:Number, r:Number, d:Boolean):void { var my_body:b2BodyDef= new b2BodyDef(); my_body.position.Set(px/worldScale, py/worldScale); if (d) { my_body.type=b2Body.b2_dynamicBody; } var my_circle:b2CircleShape=new b2CircleShape(r/worldScale); var my_fixture:b2FixtureDef = new b2FixtureDef(); my_fixture.shape=my_circle; var world_body:b2Body=world.CreateBody(my_body); world_body.CreateFixture(my_fixture); } public function draw_box(px:Number,py:Number,w:Number,h:Number,d:Boolean):void { var my_body:b2BodyDef= new b2BodyDef(); my_body.position.Set(px/worldScale, py/worldScale); if (d) { my_body.type=b2Body.b2_dynamicBody; } var my_box:b2PolygonShape = new b2PolygonShape(); my_box.SetAsBox(w/2/worldScale, h/2/worldScale); var my_fixture:b2FixtureDef = new b2FixtureDef(); my_fixture.shape=my_box; var world_body:b2Body=world.CreateBody(my_body); world_body.CreateFixture(my_fixture); } //debugDraw调试视图 public function debugDraw():void { var debugDraw:b2DebugDraw = new b2DebugDraw(); var debugSprite:Sprite = new Sprite(); addChild(debugSprite); debugDraw.SetSprite(debugSprite); debugDraw.SetDrawScale(worldScale); debugDraw.SetFlags(b2DebugDraw.e_shapeBit); world.SetDebugDraw(debugDraw); } public function update(e : Event):void { world.Step(1/30,10,10); world.ClearForces(); world.DrawDebugData(); } } }
源码下载地址:http://115.com/file/dpjjkwfz#入门篇.rar
Box2D中有一些基本的对象,这里我们先做一个简要的定义,在随后的文档里会有更详细的描述。
刚体(rigid body)
一块十分坚硬的物质,它上面的任何两点之间的距离都是完全不变的。它们就像钻石那样坚硬。在后面的讨论中,我们用物体(body)来代替刚体。
形状(shape)
一块严格依附于物体(body)的 2D 碰撞几何结构(collision geometry)。形状具有摩擦(friction)和恢复(restitution)的材料性质。
约束(constraint)
一个约束(constraint)就是消除物体自由度的物理连接。在 2D 中,一个物体有 3 个自由度。如果我们把一个物体钉在墙上(像摆锤那样),那我们就把它约束到了墙上。这样,此物体就只能绕着这个钉子旋转,所以这个约束消除了它 2 个自由度。
接触约束(contact constraint)
一个防止刚体穿透,以及用于模拟摩擦(friction)和恢复(restitution)的特殊约束。你永远都不必创建一个接触约束,它们会自动被 Box2D 创建。
关节(joint)
它是一种用于把两个或多个物体固定到一起的约束。Box2D 支持的关节类型有:旋转,棱柱,距离等等。关节可以支持限制(limits)和马达(motors)。
关节限制(joint limit)
一个关节限制(joint limit)限定了一个关节的运动范围。例如人类的胳膊肘只能做某一范围角度的运动。
关节马达(joint motor)
一个关节马达能依照关节的自由度来驱动所连接的物体。例如,你可以使用一个马达来驱动一个肘的旋转。
世界(world)
一个物理世界就是物体,形状和约束相互作用的集合。Box2D 支持创建多个世界,但这通常是不必要的。
■■■■■■■■■创建一个世界■■■■■■■■■
var gravity:b2Vec2 = new b2Vec2(0,10); var doSleep:Boolean = true; var world:b2World = new b2World(gravity,doSleep);
在以前的版本中,需要我们创建一个包围盒,不过在最新的版本中,已经不再需要。默认有一个足够大的包围盒了。
■■■■■■■■■创建一个地面盒/动态物体■■■■■■■■■
1.定义一个物体(包含位置、类型等信息)
var boxBodyDef:b2BodyDef= new b2BodyDef(); boxBodyDef.position.Set(100/worldScale, 100/worldScale); //boxBodyDef.type = b2Body.b2_dynamicBody; //boxBodyDef.type = b2Body.b2_kinematicBody; boxBodyDef.type = b2Body.b2_staticBody;
2.使用世界对象创建物体
var boxBody:b2Body = world.CreatBody(boxBodyDef);
3.定义形状
var boxShape:b2PolygonShape = new b2PolygonShape(); //设置长宽,注意参数是长、宽的一半 boxShape.SetAsBox(width/2/worldScale, height/2/worldScale);
4.定义fixture
var boxFixtureDef:b2FixtureDef = new b2FixtureDef(); boxFixtureDef.density = 1; //密度 boxFixtureDef.friction = 0.8; //摩擦力 boxFixtureDef.restitution = 0.2; //恢复力(弹性) //····· boxFixtureDef.shape = boxShape;
5.使用刚体对象创建fixture
var boxFixture:b2Fixture = boxBody.CreatFixture(boxFixtureDef);
■■■■■■■■■模拟Box2D世界■■■■■■■■■
world.Step(dt,velocityIterations,positionIterations); //dt:时间步 一般1/60-1/30,一般取1/30 //velocityIterations:速度约束求解器,一般为10 //positionIterations:位置约束求解器,一般为10