这是不可避免的,对吧?
如果有人刚开始做游戏开发人员,那么他们一定会做某种形式的平台游戏。 他们可能会尝试重新创建他们玩过的第一个Mario游戏,或者如果他们外出,也许他们会尝试某种简化的Metroidvania。 无论您采用哪种方式,都几乎可以保证您要控制的某个角色在更高,更低或跨平台的平台上需要跳跃,爬升,翻滚或以其他方式弯曲与他们目前所处位置的差距。 女士们和男士们,这被称为平台。
那我该怎么办?
好吧,我做到了:
- 创建完整的2D视频游戏的初学者指南Free Udemy Course
- 多人游戏开发纪事:第2部分-循环与泄漏
- 另一边的草更绿:刺客信条:潜行者
- 新起点,游戏开发更新! –马克·比哈尔(Marc Behar)
- Smalland:抢先体验游戏透明性的案例

现在还远没有一个完整的游戏,但是您所看到的是一个拥有2个平台和可控角色的世界。 红色大矩形是一个调试形状,向我显示了玩家精灵的轮廓。 您看到的从下面戳出来的白色是我一直用来测试的精灵。 较小的红色方块显示了玩家的精灵当前正在触摸的障碍物。 在左上方,您将看到播放器精灵的调试输出,包括其当前位置,大小,锚点和可见性。
调试信息真的很容易打开,这很方便,因为我感觉将来需要更多使用它:

在这里,我利用Phaser的渲染功能打开调试信息。 在游戏渲染完所有子画面以及您拥有的所有东西之后调用它,这对于应用后处理效果特别有用。 第一行只是输出我之前提到的所有Sprite信息,而Phaser.Rectangle是播放器Sprite上方的红色形状。
由于调试很无聊,因此让我们了解如何启动和运行其余部分。
玩家
这比在Breakout中控制球拍稍微复杂些,但在任何人的技能水平内仍然非常容易。 由于这次我确定要为播放器使用Spritesheet,因此我们必须切换加载图像的方式。

代替我一直在使用的game.load.image() ,我不得不将其更改为调用game.load.spritesheet(),以便Phaser可以拆分这些精灵以便于我轻松访问,而不是我自己去做手动。 因此,就像上次一样,我提供了一个简单的标签来引用此Sprite工作表(“ player-sprites”),文件的位置以及每个Sprite的宽度和高度。 正如您可以通过奇怪的维度所看到的那样,我没有找到可以用来测试的最佳Sprite表,但是到目前为止已经足够了。 随你。

尽管大部分内容都在Breakout示例中显示,但这里要担心的新内容是动画行。 第一个是添加 ,它将添加具有给定名称(常设)的动画以及组成该动画的一系列帧。 此外,您还可以提供参数来设置动画的帧频以及是否循环播放动画。
我们在此处添加的框架的另一个新部分是为玩家精灵的物理实体设置局部重力。 虽然直到现在我才真正意识到这一点,但是您可以设置世界重力值和局部重力值以覆盖它。 因为我想要一个相对现实的世界,所以我相信在下一个版本中,我会将这个局部重力设置换成世界重力值。
控制玩家
在Breakout中跟随鼠标操作控件非常容易,并且映射到键盘时也很容易设置:

一旦我告诉框架要关心哪些键,然后我就必须告诉它何时关心它们以及在按下它们时该怎么做:

在这里,我增加或减小了玩家角色的物理身体的水平速度,希望可以使玩家相当容易地进行操纵。 当其中一个按钮按下时,我已将其设置为在所需方向上稳定地增加速度,直至达到我设置的maxVelocityX 。 此外,我会跟踪按下某个键时玩家面对的方向,并使用该信息来了解何时直接设置速度,而不是增加或减少速度。 您还会注意到,当两个按钮都不被按下时,我相对于当前运动方向施加了负速度。 换句话说,当不需要运动时,我会降低播放器的速度。
但是跳跃呢?
容易相处的人。 好吧,大多数情况下都很容易。 首先,在按下跳跃按钮时跳跃,如果他们已经在跳跃中,则不允许跳跃:

跳转方法非常简单:

但是,我仍然不满意的一件事是何时关闭跳跃标志。 最初,我将其设置为一种怪异的东西,如果您按住跳转按钮,则该东西会允许玩家粘在平台的下面。 虽然这可能会变成一个很酷的机制,但这不是我想要的。 我现在正在尝试纠正此问题,但这是到目前为止的结果:

我正在遍历世界上所有的街区,以检查是否发生碰撞。 很好,我还是必须这样做以确保玩家不会经历任何事情。 如果玩家的y位置小于或等于碰撞块,我将关闭跳跃标志。 这适用于播放器下方的方块,但不适用于播放器旁边的方块。 您最终得到的是能够粘在墙上的能力。 同样,可能是一个有趣的机制,但不是我想要的。 我将在下一个版本中完善运动。 现在,让我们看看如何设置世界。
我们所知道的世界
信不信由你,建立游戏世界非常简单:

该行所做的只是设置世界的左上角(0,0)以及世界的宽度和高度。 积木放置在世界上的方式与我在Breakout中设置的方式相同:

这是如此相似,实际上,它使用的是Breakout实现所使用的相同createBlock函数。
设置好世界大小并将所有内容放入其中之后,只需启用物理系统,您就可以开始工作了:

接下来是什么?
细化。 播放器的动作非常稳定,但是该跳动必须修正。 此外,我需要向播放器添加更多动画,并使其适当同步。 从那里,谁知道。 也许我会以某种方式加入一些较早的技巧,或者我会为角色处理某种敌人。 不管它是什么,都会很有趣,我将解释我是如何做到的。
和往常一样,您可以在这里玩游戏,代码也可以在这里找到。 请享用!