前一章中,我们创建了游街场景,这一章中,我们开始最重要的一章,创建游戏世界,期待已久的box2d物理引擎也要登场了!
六.创建游戏世界
之前所做的,都是在游戏场景中画出一些静态图片。不能多物理场景进行模拟。接下来就要创建一个模拟的世界。我们的游戏就将在这个世界中进行模拟。在创建游戏世界之前要确定已经引入了最新版本的jbox2d。 但前jbox2d的最新版本为2.1.2。接下来的代码都是针对2.1.2进行开发的。
1. 模拟世界
需要添加一些变量
//添加一个世界需要的变量--->>> private final float RATE = 30; //屏幕到现实世界的比例 30px:1m;为了能够真实的模拟现实世界,在jbox2d中,所有的单位都是以米为标准的。所以需要设定一个屏幕到现实世界的比例。在屏幕中30像素代表现实世界中的1米。 private World world; //物理世界 private Vec2 gravity;// 声明一个重力向量对象 private float timeStep = 1f / 60f;// 物理世界模拟的的频率 private int iterations = 10;// 迭代值,迭代越大模拟越精确,但性能越低 然后再MainView构造方法中对变量进行初始化。 // --添加一个物理世界--->> gravity = new Vec2(0f, 10f); // 模拟显示世界的重力 横向重力为0,纵向重力为10 world = new World(gravity, true); // 为游戏世界添加重力,并且使世界处于睡眠状态,当物体进行改变时,在唤醒世界。这样可以很好的节省系统资源。
通过以上的代码,已经模拟出了一个游戏世界。
2. 在世界中创建物体
游戏世界是由各种各样的物体组成的,下面介绍如何创建一个物体。分为以下六步。
- 设置形状
- 创建夹具
- 为夹具绑定形状
- 创建刚体
- 通过刚体在世界中创建物体
- 为物体绑定夹具
下面介绍一些刚体。以下是百度百科的解释:在任何力的作用下,体积和形状都不发生改变的物体叫做刚体(Rigid body)。在物理学内,理想的刚体是一个固体的,尺寸值有限的,形变情况可以被忽略的物体。不论有否受力,在刚体内任意两点的距离都不会改变。在运动中,刚体上任意一条直线在各个时刻的位置都保持平行。
下面创建一个方法CreateFloorBody()。用来创建地面。
3. 创建大地
此时已经创建了世界。但是这个世界是无限延伸的,为了更好的模拟现实世界。接下来需要为这个世界添加大地。
四个参数分别为:x轴位置,y轴位置,宽度,高度
public Body createBorderBody(float x,float y,float width,float height) { PolygonShape ps = new PolygonShape();//创建形状 ps.setAsBox(width/2/RATE, height/2/RATE);//形状为一个矩形 FixtureDef fd = new FixtureDef();//创建夹具 fd.shape = ps;//为夹具绑定形状 fd.density = 0;//设置密度,当密度为0时,这个物体为静止状态。 fd.friction = 0.8f;//设置摩擦力 fd.restitution = 0.3f;//设置恢复力 BodyDef bd = new BodyDef();//创建刚体 bd.position.set((x+width/2)/RATE, (y+height/2)/RATE);//创建刚体范围 bd.type = BodyType.STATIC;//设置刚体类型,设置为静态刚体 Body body = world.createBody(bd);//创建物体并制定刚体 body.createFixture(fd);//为物体制定夹具 return body; }
方法有了,接下来就要定义地面变量
private Body floorBody;
在surfaceCreated方法中创建floorBody物体
floorBody = CreateFloorBody(0, ScreenH-FLOOR_HEIGHT, gameWidth, FLOOR_HEIGHT);
此时第一个物体创建完成。有了大地,模拟的世界就更加真实了。此时运行环境还不能看出任何效果。但是,我们的游戏世界确确实实的存在了。
不要着急,我们会在下一章节中创建世界中的物体----》发射器。