冯长宝 佟鑫 贾骋
摘要
通常情况下,游戏中的对象会按照物理规律进行移动,能体现重力、反作用力、加速度等物理特性,实现自由落体、抛物线运动、以及物理碰撞现象的模拟,给玩家带来更多“真实”的游戏体验。本文将介绍Egret引擎中物理引擎模块1P2物理引擎,并将P2物理引擎的应用进行举例分析。
【关键词】Egret 物理运动 P2物理引擎
游戏中很多的物理运动都是由物理引擎来完成的,我们可以把游戏引擎看成是汽车的发动机,它决定着汽车的性能和稳定性,而汽车的速度、操作这些都是建立在引擎的基础上的。游戏也是如此,在游戏中采用物理引擎,可以制作出赏心悦目的赛车游戏,还有血腥暴力的射击游戏,有了物理引擎,可以最大限度的还原游戏的真实度。本文以创建一个P2物理项目为例,介绍在Egret引擎中使用P2物理引擎來完成对重力的模拟。
1 P2物理引擎介绍
国内较成熟的物理引擎包括Box2D,还有今天的主题P2物理引擎。Box2D是一款基于C++语言编写的物理游戏引擎,被广泛应用在各类物理游戏中,比如风靡一时的游戏《愤怒的小鸟》。虽然它给开发者提供了简单友好的接口,但是在H5游戏平台中,因为效率的限制它的表现没有那么出色。来自斯德哥尔摩大学的Stefan Hedman,在基于Javascript的基础上,开发出了一款面向H5游戏的2D物理引擎P2。集成了各种复杂的物理公式和算法,可以帮助我们轻松地实现碰撞、加速、自由落体等物理现象的模拟。
2 创建P2物理项目
在Egret引擎中通过P2物理引擎来完成对物理运动的模拟,一般的过程如下:导入P2引擎库->创建世界world->创建地面ground->创建刚体->创建调试模拟视图,刷新世界。
P2引擎库的导入要使用Egret提供的第三方库集成方法,在项目的配置文件egretProperties.json中添加第三方库;将P2引擎以name命名为模块,以path定义P2引擎库的目录路径,应当注意的是P2引擎库应与项目目录同级;在IDE的终端面板中执行egret build-e命令就会把P2引擎库编译到项目中,成功后就可以使用了。
世界对应P2引擎库中的World类,类似于渲染引擎中的stage舞台,该World对象有一个Vec2类型的属性gravity,模拟重力加速度;它有两个元素,水平x方向和垂直y方向的分量,以数组来表示。当将gravity设置为[0,0]时表示为失重状态,[0,10]表示只有垂直方向的重力,如果将x、y都设置非。的数值后,重力将不再是垂直向下的,而是朝[x,y]方向。
形状是物理游戏中进行碰撞模拟的一个基础,地面ground的创建是由Plane平面形状来完成,这是一个特殊的形状,它沿y轴负方向无限扩展,x轴的宽度也是无限的。Plane平面形状需要添加到body刚体中,并通过调整刚体的angle角度,使平面朝向不同的方向,可以模拟墙体、地面。
接下来就是要创建游戏中的主角—body刚体了,刚体拥有速度、角度、质量等物理属性,通过形状对象来表现出具体的形状,常见的形状有圆形、矩形、胶囊形状、粒子、线段、多边形等。分别创建body刚体对象和shape形状对象,并通过使用addShpe()方法将形状添加到刚体中;设置形状的属性,position可以设置形状相对于刚体本地坐标中心的偏移量,影响刚体的重心,angle设置形状倾斜的角度,material设置形状的材质,可以使形状发生碰撞时表现出不同的特性。对于刚体对象来说,它本身也具有一定的属性:速度、角度、质量等。我们通过position属性来对刚体进行定位和移动,在进行物理模拟的过程中,会刷新刚体坐标;velocity设置刚体的线性速度,它是一个Vec2类型的对象,用数组来表示,数组中第一个元素表示水平方向的速度,当值>0时表示速度方向向右;第二个元素表示垂直方向的速度,当值>0时表示速度方向向下。
刚体创建完成就要对它进行形状贴图了,使刚体能够以游戏图像素材来显示出来。贴图的过程,就是要实时刷新图像素材的坐标和角度,使其能够与刚体对应上。为刚体添加自定义属性userData,保存对应图像素材的引用。world世界中所有的刚体都保存在bodies数组中,遍历数组中的每一个刚体,如果其userData不为空,则实时更新对应图像素材的坐标和角度。
模拟视图通过p2DebugDraw类中的drawDebug()方法来实现,应用当前world对象创建一个p2DebugDraw类对象,并添加egret.Event.ENTER FRAME事件侦听,在事件侦听回调函数中,调用drawDebugo方法,绘制P2引擎中的所有刚体对象,对所有刚体实时刷新。
由于我们将world对象通过gravity属性设置了重力加速度,当刚体对象在舞台上创建后,由于重力加速度将垂直向下进行运动,当与plane平面形状发生碰撞时,由于每个刚体的material材质属性不同,发生碰撞后反弹的速度会不相同。
3 结论
本文从P2引擎的基本元素入手,分析探讨了P2引擎库的导入,如何去创建一个物理模拟世界,通过对world,刚体等对象进行相应的属性设置,实时刷新视图模拟,来实现一个模拟重力运动。
参考文献
[1]张鑫磊.Egret HTML5游戏开发指南.北京:电子工业出版社,2016.
[2]认识HTML5 2D物理引擎P2.ht tp://bbs.egret.com/thread-6950-1-1.html.