游戏结束

这是Gamedev Canvas 教程的第 5 步(共 10 步)。您可以在 Gamedev-Canvas-workshop/lesson5.html 找到完成本课后应有的源代码。

看着球在墙壁之间弹跳,并且能够移动挡板,这很有趣,但除此之外,游戏没有任何进展或最终目标。从游戏性的角度来看,能够输掉比赛会更好。在 breakout 游戏中输掉的逻辑是,如果你用挡板错过了球,让它到达屏幕的底边,那么游戏就结束了。

实现游戏结束

让我们尝试在我们的游戏中实现游戏结束。这是第三课中的一段代码,我们在其中让球在墙壁之间弹跳。

js
if (x + dx > canvas.width - ballRadius || x + dx < ballRadius) {
  dx = -dx;
}

if (y + dy > canvas.height - ballRadius || y + dy < ballRadius) {
  dy = -dy;
}

不要让球从所有四个墙壁反弹,现在只允许三个——左、上和右。撞到底部墙壁将结束游戏。我们将编辑第二个 if 块,使其成为一个 if else 块,当球与画布的底边碰撞时,它将触发我们的“游戏结束”状态。目前,我们将显示一个警报消息并通过重新加载页面来重新启动游戏。

首先,在任何函数之前,在顶层为 interval 变量添加一个声明。

js
let interval = 0;

然后,替换您最初调用 setInterval() 的位置。

js
setInterval(draw, 10);

with

js
interval = setInterval(draw, 10);

然后用以下内容替换第二个 if 语句。

js
if (y + dy < ballRadius) {
  dy = -dy;
} else if (y + dy > canvas.height - ballRadius) {
  alert("GAME OVER");
  document.location.reload();
  clearInterval(interval); // Needed for Chrome to end game
}

让挡板击中球

本课要做的最后一件事是创建球和挡板之间的某种碰撞检测,这样它就可以从挡板上弹开并回到游戏区域。最简单的方法是检查球的中心是否在挡板的左右边缘之间。再次更新您修改的最后一部分代码,使其如下所示。

js
if (y + dy < ballRadius) {
  dy = -dy;
} else if (y + dy > canvas.height - ballRadius) {
  if (x > paddleX && x < paddleX + paddleWidth) {
    dy = -dy;
  } else {
    alert("GAME OVER");
    document.location.reload();
    clearInterval(interval);
  }
}

如果球击中了 Canvas 的底边,我们需要检查它是否击中了挡板。如果是,那么它会像您期望的那样弹开;如果不是,那么游戏将像以前一样结束。

Compare your code

看看您的代码与下面的实时示例相比如何。

注意:尝试让球在碰到挡板时移动得更快。

后续步骤

到目前为止,我们做得相当不错,现在您可以输掉比赛了,我们的游戏感觉更有趣了!但仍然缺少一些东西。让我们继续第六章——建造砖块区域——为球创建一些要摧毁的砖块。