android游戏开发框架libgdx的使用(九)—在libgdx中使用Box2d

转自:http://www.apkbus.com/forum.php?mod=viewthread&tid=19767&extra=page%3D1%26filter%3Dauthor%26orderby%3Ddateline%26orderby%3Ddateline

 

在游戏开发中难免会需要模拟现实情况,一般常见的就是模拟物理世界。

比如物体碰撞,车辆前进,物体下落等。也许有人会觉得原来有实现过一些效果没有看到用什么物理知识呢。

在我看来引入物理引擎并不是必须的,但是这样可以让游戏更逼真。物理引擎的话首选Box2d,但是它是C++写的,直接用不方便。

在Android游戏开发中使用物理引擎一般有三个比较好的选择:

1.JBox2d

Box2d的Java移植版本,速度有点慢。不过对于不熟悉C++的朋友而言这个可以拿来看看原理。

2.Havok

这个就不多说了,我怎么没有用过。

3.Libgdx

libgdx用了jni封装了box2d,速度和易用性都不错。


 

下面我们来看看一个示例,原来没有接触过box2d的朋友最好先找资料看看。

代码如下:

  1. package com.cnblogs.htynkn.listener;

  2. import com.badlogic.gdx.ApplicationListener;
  3. import com.badlogic.gdx.Gdx;
  4. import com.badlogic.gdx.graphics.GL10;
  5. import com.badlogic.gdx.graphics.OrthographicCamera;
  6. import com.badlogic.gdx.math.Vector2;
  7. import com.badlogic.gdx.physics.box2d.Body;
  8. import com.badlogic.gdx.physics.box2d.BodyDef;
  9. import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer;
  10. import com.badlogic.gdx.physics.box2d.CircleShape;
  11. import com.badlogic.gdx.physics.box2d.World;
  12. import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;

  13. public class DemoGame implements ApplicationListener {

  14. protected OrthographicCamera camera;
  15. protected Box2DDebugRenderer renderer; // 测试用绘制器
  16. private World world;

  17. @Override
  18. public void create() {
  19. camera = new OrthographicCamera(48, 32);
  20. camera.position.set(0, 15, 0);
  21. renderer = new Box2DDebugRenderer();

  22. world = new World(new Vector2(0, -9.8f), true); // 一般标准重力场
  23. BodyDef bd = new BodyDef(); //声明物体定义
  24. bd.position.set(2f, 2f);
  25. bd.type=BodyType.DynamicBody;
  26. Body b = world.createBody(bd); //通过world创建一个物体
  27. CircleShape c = new CircleShape(); //创建一个形状(圆)
  28. c.setRadius(1f); //设置半径
  29. b.createFixture(c, 1f); //将形状和密度赋给物体
  30. }

  31. @Override
  32. public void dispose() {

  33. renderer.dispose();
  34. world.dispose();

  35. renderer = null;
  36. world = null;
  37. }

  38. @Override
  39. public void pause() {
  40. // TODO Auto-generated method stub

  41. }

  42. @Override
  43. public void render() {
  44. world.step(Gdx.app.getGraphics().getDeltaTime(), 3, 3);
  45. GL10 gl = Gdx.app.getGraphics().getGL10();
  46. gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
  47. camera.update();
  48. camera.apply(gl);
  49. renderer.render(world, camera.combined);
  50. }

  51. @Override
  52. public void resize(int width, int height) {
  53. // TODO Auto-generated method stub

  54. }

  55. @Override
  56. public void resume() {
  57. // TODO Auto-generated method stub

  58. }

  59. }
复制代码

我们先创建了一个世界,重力为9.8,方向朝下。然后声明了一个物体定义,物体为动态物体(就是可以动那种),如果创建一个圆形,将形状赋给物体。然后调用进行模拟

  1. world.step(Gdx.app.getGraphics().getDeltaTime(), 3, 3);
复制代码

效果如下: 1.gif

2012-1-17 21:38 上传
下载附件(271.75 KB)

其实用法什么没有大的区别。libgdx并没有AABB那个类,要这只边界的话用

  1. world.QueryAABB(callback, lowerX, lowerY, upperX, upperY)
复制代码

就行了。 形状的话其实有很多,圆形,方形,矩形,多边形,可以具体参考Box2d的帮助文件。有人觉得使用box2d很复杂,很难和现有的东西联系起来。其实我觉得box2d用着很方便,特别是和Stage联系起来很方便。用

  1. Body.setUserData(userData)
复制代码

将Actor的名字赋给Body,然后在绘制时用

  1. Stage.findActor(name)
复制代码

改变actor的位置和状体就行了。 写在最后:这里想说几个问题:1.Box2d是一个物理引擎,不是一个游戏引擎。它模拟物理世界和法则,但是你的图像绘制什么的都是自己处理。2.Box2d的单位是米,秒。注意单位换算,不推荐直接用1像素=1米,这样有些东西会很奇怪的,比例看情况,用个30,,50就行了。3.Stage的坐标是左下角,Box2d一般是重心,注意变化。4.调试的时候可以用Box2DDebugRenderer,可以清楚看到边界和重心。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值