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

参考子龙山人系列博客:http://www.cnblogs.com/zilongshanren/tag/cocos2d/

此作者都是基于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();
    }

 

四、程序效果

源码下载


<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值