此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。

View in English Always switch to English

物理系统

这是 Gamedev Phaser 教程 16 个步骤中的第 5 步。为了在游戏对象之间进行正确的碰撞检测,我们需要用到物理系统;本文将向你介绍 Phaser 中可用的内容,并演示一种典型的简单设置。

添加物理系统

Phaser 捆绑了三个不同的物理引擎——Arcade Physics、Impact Physics 和 Matter.js Physics——第四个选项 Box2D 则以商业插件的形式提供。对于我们这样的简单游戏,可以使用 Arcade Physics 引擎。我们不需要复杂的几何计算——毕竟,这只是一个球从墙壁和砖块上反弹的游戏。

首先,在游戏中配置 Arcade Physics 引擎。将 physics 属性添加到 config 对象中,如下所示:

js
const config = {
  // ...
  physics: {
    default: "arcade",
  },
};

接下来,我们需要为小球启用物理系统——Phaser 对象默认不启用物理系统。在 create() 方法底部添加以下行:

js
this.physics.add.existing(this.ball);

接下来,如果我们想让球在屏幕上移动,可以在它的 body 上设置 velocity。继续在 create() 底部添加以下行:

js
this.ball.body.setVelocity(150, 150);

删除先前的更新指令

记得从 update() 方法中删除先前给 xy 添加值的方式,也就是将它恢复为空状态:

js
class ExampleScene extends Phaser.Scene {
  // ...
  update() {}
}

现在,我们会使用物理引擎正确处理这一点。

尝试重新加载 index.html。目前,物理引擎没有重力或摩擦力,因此球会以恒定速度沿给定方向移动。

玩转物理系统

你可以用物理系统做更多事情。例如,在 create() 中添加 this.ball.body.gravity.y = 500;,就会设置球的垂直重力。尝试将速度改为 this.ball.body.setVelocity(150, -150);,你会看到球向上发射,然后因重力向下拉动而落下。

这种功能只是冰山一角——有各种函数和变量可以帮助你操纵物理对象。查看官方的物理系统文档,并参阅使用 Arcade 和 Matter.js 物理系统的大量示例

比较你的代码

以下是你目前应该得到的结果,可以实时运行。若要查看其源代码,请点击“运行”按钮。

下一步

现在我们可以转到下一课,看看如何让球从墙壁反弹