碰撞检测

这是Gamedev Phaser 教程的 16 个步骤中的第 10 步。现在,让我们来处理下一个挑战——球与砖块之间的碰撞检测。幸运的是,我们可以使用物理引擎来检测不仅仅是单个对象(如球和挡板)之间的碰撞,还可以检测对象与组之间的碰撞。

砖块/球碰撞检测

物理引擎让一切变得简单多了——我们只需要添加两行简单的代码。首先,在你的 update() 方法中添加一行新的代码,用于检测球与砖块之间的碰撞,如下所示:

js
class ExampleScene extends Phaser.Scene {
  // ...
  update() {
    this.physics.collide(this.ball, this.paddle);
    this.physics.collide(this.ball, this.bricks, (ball, brick) =>
      this.hitBrick(ball, brick),
    );
    this.paddle.x = this.input.x || this.scale.width * 0.5;
    // ...
  }
  // ...
}

球的位置将与组中所有砖块的位置进行比较。第三个可选参数是发生碰撞时执行的函数。Phaser 会用两个参数调用此函数——第一个参数是球,我们已经显式地将其传递给了 collide 方法,第二个参数是球正在碰撞的砖块组中的单个砖块。在这里,我们在一个名为 hitBrick() 的方法中实现此行为。在 ExampleScene 类末尾,紧靠结束大括号 } 之前,添加此新方法,如下所示:

js
class ExampleScene extends Phaser.Scene {
  // ...
  hitBrick(ball, brick) {
    brick.destroy();
  }
}

就这样!重新加载你的代码,你应该可以看到新的碰撞检测按要求正常工作了。

当你使用纯 JavaScript 时,你可能会期望编写更多自己的计算来实现碰撞检测。这就是使用框架的好处——你可以把很多繁琐的代码交给 Phaser 来处理,而专注于制作游戏中最有趣、最吸引人的部分。

Compare your code

这是您到目前为止应该看到的效果,实时运行。要查看其源代码,请单击“播放”按钮。

后续步骤

我们可以击中砖块并将其移除,这是对现有游戏玩法的不错补充。如果能计算被摧毁的砖块并相应地增加分数,那就更好了。