首页 理论教育 Android游戏开发:轻松创建Box2D物理世界

Android游戏开发:轻松创建Box2D物理世界

时间:2023-10-22 理论教育 版权反馈
【摘要】:不管是Body(物体)还是Joint(关节)都必须放在Box2D这个物理世界中,因为物理世界也是有范围的,一旦物体和关节不在世界范围内,它们将不会进行物理模拟。在创建物体和关节时,很多代码需要传入以“米”作为单位的数值,所以为了便于转换可以定义一个成员变量:在Box2D的物理世界中,为了更加贴切地模拟现实,部分函数参数不再使用“像素”而是用“米”表示。

Android游戏开发:轻松创建Box2D物理世界

在Box2D引擎中,类库World(完整写法是jbox2d.dynamics.World)是Box2D引擎中的物理世界。不管是Body(物体)还是Joint(关节)都必须放在Box2D这个物理世界中,因为物理世界也是有范围的,一旦物体和关节不在世界范围内,它们将不会进行物理模拟。

接下来将通过一个实例的实现过程,详细讲解使用Box2D创建物理世界的方法

实例文件MySurfaceView.java的主要代码如下

接下来开始分析实例文件的具体实现过程

1)首先看一下World类的构造函数:

类World只有这一种构造方式,其三个参数的说明如下。

■ 第一个参数:AABB类的实例,AABB表示一个物理模拟世界的范围。

■ 第二个参数:Vec2实例,一个二维世界向量类,在Box2D中的最常用的一种数据类型;在这里表示物理世界的重力方向。

■ 第三个参数:布尔值,表示在物理世界中,静止不动的物体是否对其进行休眠。如果设置其值为“true”,则表示当物理世界开始进行模拟时,在这个物理世界中静止没有运行的物体都将进行休眠,除非物体被施加了力的作用或者与其他物体发生碰撞之后会被唤醒;如果设置其值设置为“false”,那么物理世界中的所有物体不管是否静止都会一直进行物理模拟。

2)通过如下代码创建一个物理世界:

在上述代码中需要注意如下两点。

■ aabb设置为物理世界范围传入的参数,不要理解成像素。在Box2D的物理世界中,

单位是“米(m)”。

■ 设置物理世界的重力向量(Gravity),其两个参数在这里分别表示物理世界中的X轴

与Y轴方向上的重力数值,其值的“+”“”号在这里表示X与Y轴的重力方向,X

轴正值表示向右,Y轴正值表示向下;因为是模拟真实世界,所以这里的X重力向量(www.xing528.com)

设置为零,Y轴方向设置为现实生活中的重力值10(可以理解为10N)。

(3)前面的代码已经创建了一个物理世界,但只是定义了物理世界,并没有开始进行物理模拟,所以还需要world设置物理模拟:

此函数表示让物理世界开始进行物理模拟,其包含的两个参数的含义如下。

■ 第一个参数:表示(时间步)物理世界模拟的频率。

■ 第二个参数:表示(迭代值)迭代值越大模拟越精确,但性能越低。

此处需要注意如下4点。

■ 因为物理世界模拟具有持续性,所以应该将设置放在线程中,不断地让物理世界进行模拟。

■ 时间步:应该与游戏的刷新率相同,否则物理世界模拟将不同步。

■ 迭代值:可以理解为在单次时间步中进行遍历模拟运算数据的次数。

■ 在Box2D中最常使用的单位是float浮点数类型,编者刚接触Box2D时,在定义物理世界模拟频率时,写成了以下错误的形式:

这样写导致物理世界的物体永远不运动,其原因就是“1/60”的值永远是0,所以正确书写形式应该是:

到此一个物理世界被创建出来并且可以进行模拟了,但是因为物理世界中并没有放置任何的物体,所以运行项目在视觉中将看不到任何的效果。编者推荐物理模拟的频率一般设为每秒60帧,迭代设为10,具体设置根据应用和设备性能情况而定。

在创建物体和关节时,很多代码需要传入以“米”作为单位的数值,所以为了便于转换可以定义一个成员变量

在Box2D的物理世界中,为了更加贴切地模拟现实,部分函数参数不再使用“像素”而是用“米”表示。为了能将模拟的物理世界映射到手机屏幕中,定义一个屏幕与现实世界的比例变量“RATE”,这个比例值编者推荐设置为30,因为一般不会修改此值,所以可以定义为final常量类型。

另外还需要注意,不要用int类型定义此变量,应该用float类型来定义。否则会发生如同timeStep类似的状况,此值可能会比预计的小。例如:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈