物理学

这是 Phaser 游戏开发教程的 16 个步骤中的 **第 5 步**。您可以在 Gamedev Phaser 教程 中找到完成本课后代码应有的样子,请访问 Gamedev-Phaser-Content-Kit/demos/lesson05.html

为了在我们游戏中实现对象之间的正确碰撞检测,我们需要使用物理引擎;本文将向您介绍 Phaser 中可用的功能,并演示一个典型的简单设置。

添加物理

Phaser 附带了三种不同的物理引擎——Arcade Physics、P2 和 Ninja Physics——以及第四种选择 Box2D,作为商业插件提供。对于像我们这样的简单游戏,我们可以使用 Arcade Physics 引擎。我们不需要任何繁重的几何计算——毕竟它只是一个球弹在墙壁和砖块上。

首先,让我们在游戏中初始化 Arcade Physics 引擎。在 create 函数的开头添加 physics.startSystem() 方法(将其作为函数内的第一行),如下所示

js
game.physics.startSystem(Phaser.Physics.ARCADE);

接下来,我们需要为物理系统启用球体——Phaser 对象物理默认情况下未启用。在 create() 函数底部添加以下行

js
game.physics.enable(ball, Phaser.Physics.ARCADE);

接下来,如果我们想在屏幕上移动球体,可以在其 body 上设置 velocity。再次在 create() 函数底部添加以下行

js
ball.body.velocity.set(150, 150);

移除我们之前的更新说明

请记住,从 update() 函数中删除我们之前添加 xy 值的方法

js
function update() {
  ball.x += 1;
  ball.y += 1;
}

我们现在正在使用物理引擎正确处理它。

最终代码检查

最新的代码应如下所示

js
let ball;

function preload() {
  game.scale.scaleMode = Phaser.ScaleManager.SHOW_ALL;
  game.scale.pageAlignHorizontally = true;
  game.scale.pageAlignVertically = true;
  game.stage.backgroundColor = "#eee";
  game.load.image("ball", "img/ball.png");
}

function create() {
  game.physics.startSystem(Phaser.Physics.ARCADE);
  ball = game.add.sprite(50, 50, "ball");
  game.physics.enable(ball, Phaser.Physics.ARCADE);
  ball.body.velocity.set(150, 150);
}

function update() {}

再次尝试重新加载 index.html——球体现在应该沿给定方向持续移动。目前,物理引擎的重力和摩擦力都设置为零。添加重力会导致球体向下落,而摩擦力最终会使球体停止。

物理乐趣

您可以使用物理引擎做更多的事情,例如,通过添加 ball.body.gravity.y = 100;,您可以设置球体的垂直重力。结果它将向上发射,然后由于重力的作用而落下。

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

比较您的代码

您可以在下面的实时演示中查看本课的完成代码,并进行体验以更好地理解其工作原理

后续步骤

现在我们可以进入下一课,了解如何使球体 弹离墙壁