一、直接切入主题,经过上篇的HelloBox2D,大家应该有点概念了。在Box2D的世界里,无非要干以下几件事情:
- 首先创建一个body定义结构体,用以指定body的初始属性,比如位置或者速度。
- 创建好body结构体后,你就可以调用world对象来创建一个body对象了。
- 然后,你为body对象定义一个shape,用以指定你想要仿真的物体的几何形状
- 接着创建一个fixture定义,同时设置之前创建好的shape为fixture的一个属性,并且设置其它的属性,比如质量或者摩擦力。(本篇重点)
- 最后,你可以使用body对象来创建fixture对象,通过传入一个fixture的定义结构就可以了。
- 你可以往单个body对象里面添加很多个fixture对象。这个功能在你创建特别复杂的对象的时候非常有用。比如自行车,你可能要创建2个轮子,车身等等,这些fixture可以用关节连接起来。
二、开始写代码吧,和上次框架一样,这里只说明一下主要的舞台类
world = new World(new Vector2(0, -30f), true);
首先创建一个物理世界,这里将加速度设置为30,使得下落效果明显点,你也可以自己调整看效果。
BodyDef bd = new BodyDef();
bd.position.set(2, 2);
Body groundBody = world.createBody(bd);
EdgeShape edge = new EdgeShape();
edge.set(new Vector2(0f, 0f), new Vector2(48f, 0f));
FixtureDef boxShapeDef = new FixtureDef();
boxShapeDef.shape = edge;
groundBody.createFixture(boxShapeDef);
再来定义和生成一个图形——边,大家可以参照上述的步骤。
BodyDef ballBodyDef = new BodyDef();
ballBodyDef.type = BodyType.DynamicBody;
ballBodyDef.position.set(24f, 60f);
body = world.createBody(ballBodyDef);
body.setUserData("ball");
CircleShape circle = new CircleShape();
circle.setRadius(2f);
FixtureDef ballShapeDef = new FixtureDef();
ballShapeDef.shape = circle;
ballShapeDef.density = 1.0f;
ballShapeDef.friction = 0.2f;
ballShapeDef.restitution = 0.8f;
body.createFixture(ballShapeDef);
再来一个图形——圆,大家可以看到红色部分为关键,球弹不弹就这里了。
- Density 就是单位体积的质量(密度)。因此,一个对象的密度越大,那么它就有更多的质量,当然就会越难以移动。
- Friction 就是摩擦力。它的范围是0~1.0, 0意味着没有摩擦,1代表最大摩擦,几乎移不动的摩擦。
- Restitution 回复力。它的范围也是0到1.0. 0意味着对象碰撞之后不会反弹,1意味着是完全弹性碰撞,会以同样的速度反弹。
三、libgdx与Box2D的结合,定义一个纹理
private Texture ball;
绑定一张图片
ball = new Texture(Gdx.files.internal("Ball.jpg"));
我们不再使用测试绘制器,而是使用常用的SpriteBatch,将纹理与物体同步刷新绘制
@Override
public void draw() {
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
world.step(Gdx.app.getGraphics().getDeltaTime(), 6, 2);
batch.begin();
batch.draw(ball, body.getPosition().x, body.getPosition().y, 5f, 5f);
batch.end();
super.draw();
}
四、程序效果
源码:https://github.com/dwintercode/Box2D