2013年9月30日 星期一

Android 游戏引擎libgdx之Box2D 案例实践——弹球

http://www.cnblogs.com/dwinter/archive/2013/01/14/libgdx-box2d-02.html

此作者都是基于IOS的cocos2D开发,本人参考并且转化为libgdx的cocos2d使用。
libgdx目前还主要用于Android开发,想学IOS的亲,请看上述作者的博客。
欢迎转载,但请加上来自www.cnblogs.com/dwinter或者dwintergame.com

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

四、程序效果
作品发布:dwintergame.com 
个人开发盈利方案: 传送门 
本文版权归作者D.Winter和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。