libGDX Box2d

创建libgdx下的Box2D

 Box2D是一个物理引擎库。它是最受欢迎的2d游戏物理引擎之一,并且已经被翻译成了多种语言、多种引擎、包括libGDX。
在libgdx中的Box2D的实现是对它的C++引擎的一个简单封装。
从libgdx1.0开始,Box2D默认情况下是一个独立的部分,而不是包括在libgdx中。因此需要手工安装。

内容列表


 

创建一个世界

使用BOX2D第一件事就是要创建一个世界。world对象主要包括了在世界中的所有的物理对象。它不会为你渲染对象,要想渲染的话要使用libgdx的图形功能。也就是说,libgdx提供了一个Box2D的调试渲染器,它可以极其方便的调试你的物理模拟。
使用下面的代码来创建一个世界:
World world = new World(new Vector2(0, -10), true); 
我们制定的第一个参数是一个2维向量,0制定了在水平方向上没有重力加速度,-10制定了在竖直方向上重力加速度为10(假设你的y轴向上),方向向下,就跟我们的实际生活中是一样的。这些值可以被指定为你想要的任何值,但是要记住使用不便的比例。在Box2D中,一个单位是一米。
第二个参数告诉创建的世界是否可以允许世界中的物体睡眠。通常情况下,我们希望物体能够睡眠,这样就可以节省CPU的使用。但是也存在某种情况你不想让物体睡眠。
我们建议,在绘制图形的时候使用和Box2D相同的单位。这就意味着使用米为单位来绘制精灵。要使得图形可见,你应该使用一个viewportWidth和viewportHeight都是米为单位的相机。

调试渲染器(Debug Renderer)

在调试过程中使用DebugRenderer。
Box2DDebugRenderer debugRenderer = new Box2DDebugRenderer();

开始模拟

要更新我们模拟的世界,我们需要告诉世界来步进。Stepping主要通过世界来更新世界。调用步进方法的最好的地方是在render()方法的最后。在一个完美的世界中,每一个物体的帧速率都是一样的。
world.step(1/60f, 6, 2);
第一个参数指定了帧数,ligdx建议对于移动电话设备,指定1/45f(45分之1秒)是较好的。
另两个参数是velocityIterations和positionIterations。现在我们指定为6和2,要知道更多,可以阅读Box2D文档。

渲染

我们建议在你更新所有物理模拟之前完成所有图形的绘制,否则就会不同步。使用上面的debugRenderer渲染:
debugRenderer.render(world, camera.combined);
第一个参数是world,第二个是libgdx中的相机。

Objects/Bodies 刚体

现在如果允许游戏的话不会有任何的效果。所以现在我们要添加一些对象。
在Box2D中,物体被称作刚体,并且每一个刚体都是通过fixture创建的,fixture有固定和位置和方向。fixture可以是你想象的任何形状,或者把几个形状组合在一起。
fixture有shape,denisity(密度),griction(摩擦力)和restitution(恢复力)属性。
刚体有三种状态:动态的、运动的、静态的。

动态刚体

动态刚体是运动的,能够被其他刚体施加力的作用的物体。动态刚体适合那些需要移动和被力作用的物体。
现在我们已经学习了fixture,它用来创建我们的刚体,所以让我们来创建一些刚体:
// First we create a body definition
BodyDef bodyDef = new BodyDef();
// We set our body to dynamic, for something like ground which doesn't move we would set it to StaticBody
bodyDef.type = BodyType.DynamicBody;
// Set our body's starting position in the world
bodyDef.position.set(100, 300);

// Create our body in the world using our body definition
Body body = world.createBody(bodyDef);

// Create a circle shape and set its radius to 6
CircleShape circle = new CircleShape();
circle.setRadius(6f);

// Create a fixture definition to apply our shape to
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = circle;
fixtureDef.density = 0.5f; 
fixtureDef.friction = 0.4f;
fixtureDef.restitution = 0.6f; // Make it bounce a little bit

// Create our fixture and attach it to the body
Fixture fixture = body.createFixture(fixtureDef);

// Remember to dispose of any shapes after you're done with them!
// BodyDef and FixtureDef don't need disposing, but shapes do.
circle.dispose();










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值