为游戏添加检查点
警告
该教程版本已过时。请参考新版平台游戏教程。
在上一个教程中,我们通过将玩家与敌人碰撞时删除玩家来结束。这不是大多数游戏的运作方式。通常,游戏不会删除玩家,而是会设置一个“检查点”。“检查点”会保存游戏的状态和玩家的状态到变量中。然后,如果玩家死亡,游戏和/或玩家会从“检查点”重新开始。
对于本教程,保存整个游戏的状态和玩家的状态可能有点复杂。相反,当玩家与“检查点”对象碰撞时,我们将把“检查点”对象的位置存储在变量中。而且,我们不会删除玩家,而是会将其位置重新设置为变量中存储的位置。
创建检查点对象
让我们从游戏中创建一个新的精灵对象开始。将其命名为“checkpoint”。可以使用任何您有的 .jpg 或 .png 精灵图像。我将使用一个仙人掌精灵。
接下来,将精灵对象添加到场景中。您的精灵图像可能太大或太小。使用精灵的手柄调整图像的大小。在我的情况下,它将是如上所示的仙人掌精灵对象。将其放在您想要设置“检查点”的任何位置。您可以在场景中的多个位置添加对象精灵。这样,您可以设置多个“检查点”。
添加事件
现在我们在场景中有了“检查点”对象,让我们添加事件。我们从一个条件开始,检查“player”和“检查点”之间是否发生碰撞。如果发生碰撞,我们将“检查点”对象精灵的 X 和 Y 位置存储到一个名为 checkpointX 和 checkpointY 的场景变量中。
在上面的示例中,我们使用 表达式 来获取“检查点”对象精灵的 X 和 Y 位置。这与我们更新记分文本的方式类似。
条件现在将存储“检查点”对象的 X 和 Y 位置,与我们的“Player”对象发生碰撞。因此,我们不会删除“Player”精灵对象,而是使用变量设置其 X 和 Y 位置。
解决位置错误
如果您在按照操作并选择了仙人掌作为“检查点”,那么您可能会注意到我们刚刚创建了一个 bug!我们的玩家角色比仙人掌更高。在这种情况下,高度差“不”太大。乍一看可能看不出任何问题,但您会注意到玩家角色会被卡在地面中但又会被传送到最近的表面。如果高度差很大,角色可能会掉到地下。因此,最好解决这个问题。
在这种情况下,我们可以通过在 Y 轴上缩放仙人掌精灵使其高度与玩家一样高甚至更高来轻松解决问题。由于现在您已经知道如何缩放/调整精灵的大小,让我们看看如何使用更具挑战性但也更精确的方法来解决问题。让我们使用数学来解决这个问题。
使用更复杂的解决方案来展示表达式的强大。我的解决方案是通过一个变量设置玩家的 Y 位置。然后,我从“检查点”的高度中减去“player”的高度。这样,我可以得到 Player 和“检查点”高度的差异。通过从变量返回的值中减去该差异来完成解决方案。
使用更简单的解决方案,但仍然使用数学的方法,可以从变量的值中减去,比如 30 像素。在使用试错法找到最适合的数字。但是,为了得到确切的值,我给出了一个更复杂的示例用于使用。
您可能还想知道为什么我要从 Y 中减去值而不是将值添加到 Y 中。问题在于“检查点”的高度低于“Player”的高度。这意味着我需要将玩家设置得更高。注意 Y 轴上的数值从顶部向底部增加。Y 轴从顶部以 0 开始。向下移动时数值增加。从技术上讲,要将某物移动到更高的位置,我需要更低的值。😃
以上是游戏中添加检查点的步骤。希望您能顺利完成!大多数2D引擎都是这样工作的。我们从左上角开始,这是坐标0,0。随着我们沿着X轴向右移动,我们增加第一个坐标数字。随着我们沿着Y轴向下移动,我们增加第二个坐标数字。您可以在上面的图片中看到这是如何应用的。
解决另一个bug
现在,如果我们运行一个预览,我们的玩家死了,它的位置将被设置为最后保存的“检查点”值。但还有一个bug!如果我们的玩家在碰撞任何“检查点”之前死亡,那么变量就从未被设置过。默认情况下,变量的值为0,所以我们的玩家将重新出现在位置0,0,这是如上图中所示的左上角。
我们可以通过将检查点值的默认值设置为场景开始时玩家的起始位置来轻松解决这个问题。
因此,当我们的场景开始时,我们已经将玩家放在适当的位置,我们只需获取玩家的位置并将玨玩家位置存储为“检查点”位置。如果玎玩家在与任何检查点碰撞之前死亡,则使用玨玩家的原始位置变量将其位置设置回场景的开头。
改善系统
利用您迄今所学到的知识,您可以尝试添加文本以显示我们是否到达了检查点。然后也许,播放动画让仙人掌跳动或执行其他有趣的操作。