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

View in English Always switch to English

游戏结束

这是 Gamedev Canvas 教程 10 个步骤中的第 5 步。在你完成了本节教程之后,你可以在 Gamedev-Canvas-workshop/lesson5.html 看到源码。

看着球从墙上反弹,并且能够移动球板很有趣,但除此之外,游戏什么都不会发生,也没有进度或最终目标。从游戏玩法的角度来看,最好能让玩家输掉游戏。在打砖块游戏中,输掉游戏的逻辑是:如果你没有用球板接住球,让球到达屏幕底部边缘,那么游戏就结束了。

实现游戏结束

让我们尝试在游戏中实现游戏结束。下面是第三课中让球从墙上反弹的代码片段:

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);

替换成:

js
interval = setInterval(draw, 10);

然后将第二个 if 语句替换为以下内容:

js
if (y + dy < ballRadius) {
  dy = -dy;
} else if (y + dy > canvas.height - ballRadius) {
  alert("游戏结束");
  document.location.reload();
  clearInterval(interval); // Chrome 需要这一行来结束游戏
}

让球板击球

本节教程最后要做的是在球和球板之间创建某种碰撞检测,这样球就可以从球板上反弹并回到游戏区域。最简单的做法是检查球的中心是否位于球板的左右边缘之间。再次更新你刚才修改的最后一段代码,改成如下内容:

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

如果球碰到画布的底部边缘,我们需要检查它是否碰到了球板。如果碰到了,它就会如你预期那样反弹;如果没有,游戏就会像之前一样结束。

比较你的代码

看看你的代码与下面的实时示例相比如何:

备注:试着让球在碰到球板时移动得更快。

下一步

到目前为止,我们做得相当不错。现在你会输掉游戏,游戏也开始变得更值得玩了!但它仍然缺少一些东西。让我们继续进入第六章——构建砖块区域——并创建一些砖块让球去摧毁。