Box2D新手入门

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

你可能感兴趣的:(约束,box2D,马达,世界,形状,关节,刚体)