一、直接切入主题,经过上篇的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();
    }


 

四、程序效果


图形化编程怎么用box2D做出跳跃的效果_github

源码:https://github.com/dwintercode/Box2D