android游戏开发框架libgdx的使用(九)—在libgdx中使用Box2d
在游戏开发中难免会需要模拟现实情况,一般常见的就是模拟物理世界。
比如物体碰撞,车辆前进,物体下落等。也许有人会觉得原来有实现过一些效果没有看到用什么物理知识呢。
在我看来引入物理引擎并不是必须的,但是这样可以让游戏更逼真。物理引擎的话首选Box2d,但是它是C++写的,直接用不方便。
在Android游戏开发中使用物理引擎一般有三个比较好的选择:
1.JBox2d
Box2d的Java移植版本,速度有点慢。不过对于不熟悉C++的朋友而言这个可以拿来看看原理。
2.Havok
这个就不多说了,我怎么没有用过。
3.Libgdx
libgdx用了jni封装了box2d,速度和易用性都不错。
下面我们来看看一个示例,原来没有接触过box2d的朋友最好先找资料看看。
代码如下:
1 package com.cnblogs.htynkn.listener; 2 3 import com.badlogic.gdx.ApplicationListener; 4 import com.badlogic.gdx.Gdx; 5 import com.badlogic.gdx.graphics.GL10; 6 import com.badlogic.gdx.graphics.OrthographicCamera; 7 import com.badlogic.gdx.math.Vector2; 8 import com.badlogic.gdx.physics.box2d.Body; 9 import com.badlogic.gdx.physics.box2d.BodyDef; 10 import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer; 11 import com.badlogic.gdx.physics.box2d.CircleShape; 12 import com.badlogic.gdx.physics.box2d.World; 13 import com.badlogic.gdx.physics.box2d.BodyDef.BodyType; 14 15 public class DemoGame implements ApplicationListener { 16 17 protected OrthographicCamera camera; 18 protected Box2DDebugRenderer renderer; // 测试用绘制器 19 private World world; 20 21 @Override 22 public void create() { 23 camera = new OrthographicCamera(48, 32); 24 camera.position.set(0, 15, 0); 25 renderer = new Box2DDebugRenderer(); 26 27 world = new World(new Vector2(0, -9.8f), true); // 一般标准重力场 28 BodyDef bd = new BodyDef(); //声明物体定义 29 bd.position.set(2f, 2f); 30 bd.type=BodyType.DynamicBody; 31 Body b = world.createBody(bd); //通过world创建一个物体 32 CircleShape c = new CircleShape(); //创建一个形状(圆) 33 c.setRadius(1f); //设置半径 34 b.createFixture(c, 1f); //将形状和密度赋给物体 35 } 36 37 @Override 38 public void dispose() { 39 40 renderer.dispose(); 41 world.dispose(); 42 43 renderer = null; 44 world = null; 45 } 46 47 @Override 48 public void pause() { 49 // TODO Auto-generated method stub 50 51 } 52 53 @Override 54 public void render() { 55 world.step(Gdx.app.getGraphics().getDeltaTime(), 3, 3); 56 GL10 gl = Gdx.app.getGraphics().getGL10(); 57 gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 58 camera.update(); 59 camera.apply(gl); 60 renderer.render(world, camera.combined); 61 } 62 63 @Override 64 public void resize(int width, int height) { 65 // TODO Auto-generated method stub 66 67 } 68 69 @Override 70 public void resume() { 71 // TODO Auto-generated method stub 72 73 } 74 75 }
我们先创建了一个世界,重力为9.8,方向朝下。
然后声明了一个物体定义,物体为动态物体(就是可以动那种),如果创建一个圆形,将形状赋给物体。
然后调用进行模拟
1 world.step(Gdx.app.getGraphics().getDeltaTime(), 3, 3);
效果如下:
其实用法什么没有大的区别。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,可以清楚看到边界和重心。


浙公网安备 33010602011771号