Phaser支持多种物理系统,每一种都以插件形式运作,任何Phaser场景都能使用它们。在本文写作时,已经装有Arcade, Impact, Matter.js三种物理系统。针对本教程,我们将给我们的游戏使用Arcade物理系统,它简单,轻量,完美地支持移动浏览器。

物理精灵在生成时,即被赋予body(物体)属性,这个属性指向它的Arcade物理系统的Body。它表示精灵是Arcade物理引擎中的一个物体。物体对象有很多属性和方法,我们可以玩一下。

比如,在一个精灵上模仿重力效果,可以这么简单写:

player.body.setGravityY(300)

这是个随意的值,但逻辑讲,值越大你的对象感觉越重,下落越快。如果你把这些加到你的代码里,或者运行part5.html,你会看到玩家不停地往下落,完全无视我们先前生成的地面:

image

原因在于,我们还没有测试地面和玩家之间的碰撞。

我们已经跟Phaser说,我们的地面和平台将是静态物体。但是我们没有那么做,反而生成了动态的。如此,当玩家和他们碰撞时,玩家会停止一瞬,然后全部崩塌。这是因为,除非别那么说,否则地面精灵是会移动的物体,当玩家碰到它时,碰撞导致的力会作用语地面,因此两个物体交换彼此的速度,于是地面也开始下落。

要想玩家能与平台碰撞,我们可以生成一个碰撞对象。该对象监控两个物体(可以是组),检测二者之间的碰撞和重叠事件。如果发生事件,这时它可以随意调用我们的回调函数。不过仅仅就与平台间的碰撞而言,我们没必要那么做:

this.physics.add.collider(player, platforms);

碰撞器(Collider)是施魔法的地方。它接收两个对象,检测二者之间的碰撞,并使二者分开。在本例中,我们把玩家精灵和平台组交给它。它很聪明,可以执行针对所有组成员的碰撞,所以这一个调用就能处理与组合以及所有平台的碰撞。结果就有了一个稳固的平台,不再崩塌:

image