您的位置:首页 > 其它

Box2D新手入门

2012-09-25 00:00 99 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息