碰撞檢測

這是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

這是您到目前為止應該看到的效果,即時執行。要檢視其原始碼,請單擊“播放”按鈕。

後續步驟

我們可以擊中磚塊並將其移除,這是對現有遊戲玩法的不錯補充。如果能計算被摧毀的磚塊並相應地增加分數,那就更好了。