Software Development  •
软件开发Electronic Technology & Software Engineering  电子技术与软件工程• 23【关键词】Egret 物理运动 P2物理引擎
游戏中很多的物理运动都是由物理引擎
来完成的,我们可以把游戏引擎看成是汽车的
发动机,它决定着汽车的性能和稳定性,而汽
车的速度、操作这些都是建立在引擎的基础上
的。游戏也是如此,在游戏中采用物理引擎,
可以制作出赏心悦目的赛车游戏,还有血腥暴
力的射击游戏,有了物理引擎,可以最大限度
的还原游戏的真实度。本文以创建一个P2物
理项目为例,介绍在Egret 引擎中使用P2物
理引擎来完成对重力的模拟。
1 P2物理引擎介绍
国内较成熟的物理引擎包括Box2D ,还
有今天的主题P2物理引擎。Box2D 是一款基
于C++语言编写的物理游戏引擎,被广泛应
用在各类物理游戏中,比如风靡一时的游戏《愤
怒的小鸟》。虽然它给开发者提供了简单友好
的接口,但是在H5游戏平台中,因为效率的
限制它的表现没有那么出。来自斯德哥尔摩
javascript游戏引擎
大学的Stefan Hedman ,在基于JavaScript 的基
础上,开发出了一款面向H5游戏的2D 物理
引擎P2。集成了各种复杂的物理公式和算法,
可以帮助我们轻松地实现碰撞、加速、自由落
体等物理现象的模拟。
2 创建P2物理项目
在Egret 引擎中通过P2物理引擎来完
成对物理运动的模拟,一般的过程如下:导
入P2引擎库->创建世界world->创建地面
ground->创建刚体->创建调试模拟视图,刷
新世界。
P2引擎库的导入要使用Egret 提供基于Egret 引擎P2物理系统技术研究
文/冯长宝1  佟鑫2  贾骋3
的第三方库集成方法,在项目的配置文件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 都设置非0的数值后,重力将不再是垂直向下的,而是朝[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 事件侦听,在事件侦听回调函数中,调用drawDebug()方法,绘制P2引擎中的所有刚体对象,对所有刚体实时刷新。由于我们将world 对象通过gravity 属性设置了重力加速度,当刚体对象在舞台上创建后,由于重力加速度将垂直向下进行运动,当与plane 平面形状发生碰撞时,由于每个刚体的material 材质属性不
同,发生碰撞后反弹的速度会不相同。3 结论本文从P2引擎的基本元素入手,分析探讨了P2引擎库的导入,如何去创建一个物理模拟世界,通过对world 、刚体等对象进行相应的属性设置,实时刷新视图模拟,来实现一个模拟重力运动。参考文献[1]张鑫磊.Egret HTML5游戏开发指南.北京:电子工业出版社,2016.[2]认识HTML5 2D 物理引擎P2./thread-6950-1-1.html.作者简介冯长宝(1979-),男,吉林省桦甸市人。毕业于东北师范大学,硕士研究生学历。现为吉林动画学院虚拟现实学院副教授。主要研究方向为游戏开发技术。作者单位1.吉林动画学院虚拟现实学院  吉林省长春市  130012  2.吉林动画学院游戏学院  吉林省长春市  130012 3.吉林动画学院虚拟现实学院  吉林省长春市  130012