RainCat:第5课

下一个场景

那就对了! 我们正在转移到另一个场景。 实际上,完成后,这将是我们应用程序的第一个屏幕。 创建新场景,将其放置在Scenes文件夹下,并将其命名为MenuScene 。 在MenuScene.swift文件中输入以下代码:

按钮状态!

在SpriteKit中,按钮可能比较棘手。 有很多可用的第三方选项(我甚至自己做了一个),但是从理论上讲,您只需要知道三种触摸方法即可:

  • touchesBegan(_ touches:with event 🙂
  • touchesMoved(_ touchs:with event 🙂
  • touchesEnded(_ touches:with event 🙂

我们在更新保护伞时简要介绍了这一点,但是现在我们需要知道:触摸了哪个按钮; 我们是释放水龙头还是单击该按钮; 如果我们仍在触摸它。 这就是我们的selectedButton变量起作用的地方。 当我们开始触摸时,我们可以捕获使用该变量开始单击的按钮。 如果将其拖动到按钮之外,则可以对其进行处理并为其提供适当的纹理。 释放触摸时,我们可以查看是否仍在触摸按钮内部。 如果是,那么我们可以处理与其相关的动作。 将以下代码行添加到MenuScene.swift的底部:

采取行动了!

现在,我们已经掌握了基本的按钮行为,我们需要一个事件来触发它们的点击。 易于实现的按钮是startButton 。 单击时,我们只需要展示GameScene即可 。 将MenuScene.swift函数中的handleStartButtonClick()更新为以下代码:

  func handleStartButtonClick(){ 
let transition = SKTransition.reveal(with:.down,duration:0.75)
让gameScene = GameScene(size:size)
gameScene.scaleMode = scaleMode
  view?.presentScene(gameScene,过渡:过渡) 
}

如果您现在运行该应用程序并按按钮,游戏将开始!

现在我们需要实现静音切换。 我们已经有一个声音管理器,但是现在我们需要能够告诉它是否静音。 在Constants.swift中,我们需要添加一个键以保持静音。 添加以下行:

 让MuteKey =“ RAINCAT_MUTED” 

我们将使用它来将布尔值保存到UserDefaults中 。 现在我们已经完成了设置,现在可以进入SoundManager.swift了 。 这是我们将检查和设置UserDefaults的地方,以查看是否静音。 在文件顶部的trackPosition变量下,添加以下行:

  private(set)var isMuted = false 

这是主菜单(以及将播放声音的其他任何东西)检查以确定是否允许声音的变量。 我们将其初始化为false,但是现在我们需要检查UserDefaults以查看用户的需求。 将init()函数替换为以下内容:

退出游戏!

现在,我们已经有了用于主菜单的第一类按钮,我们可以通过将退出按钮添加到游戏场景中来从事一些棘手的业务。 我们的游戏风格可以带来一些有趣的互动。 当前,雨伞将移动到您触摸的任何地方或移动的位置。 显然,在尝试离开游戏时将保护伞移至退出按钮是非常差的用户体验,因此我们将尝试阻止这种情况的发生。

我们正在实现的退出按钮将模仿我们之前添加的开始游戏按钮,而大多数过程保持不变。 变化将在于我们处理触摸的方式。 将您的quit_buttonquit_button_pressed资产放入Assets.xcassets文件中,我们可以将以下代码添加到我们的HudNode.swift文件中:

 私有var quitButton:SKSpriteNode! 
私人让quitButtonTexture = SKTexture(imageNamed:“ quit_button”)
私人让quitButtonPressedTexture = SKTexture(imageNamed:“ quit_button_pressed”)

这将处理我们的quitButton参考以及为按钮状态设置的纹理。 为了确保我们在尝试退出时不会无意间更新伞,我们需要一个变量来告诉HUD(和游戏场景)我们正在与退出按钮而不是伞交互。 在ShowingHighScore布尔变量下面添加以下代码:

  private(set)var quitButtonPressed = false 

同样,这是只有HudNode可以设置的变量,但其他类可以检查。 现在已经设置了变量,我们可以将按钮添加到HUD。 将以下代码添加到setup(size 🙂函数中:

现在已经放置了按钮,我们需要能够与它进行交互。 现在,我们在GameScene中进行交互的唯一地方是与雨伞 Sprite进行交互时。 在我们的示例中,HUD将优先于伞,这样用户就不必为了退出而将伞移开。 我们可以在HudNode.swift中创建与GameScene.swift中的触摸功能相似的功能。 将以下代码添加到HudNode.swift中

现在我们有了一个按钮,我们需要一种方法来使其影响GameScene将以下行添加到HudeNode.swift的顶部:

  var quitButtonAction:(()->())? 

这是一个没有输入也没有输出的通用闭包。 我们将在GameScene.swift文件中使用代码进行设置,并在单击HudNode.swift中的按钮时调用它。 然后,我们可以将touchDOedAtPoint(point 🙂函数中先前创建的代码中的TODO替换为:

 如果quitButton.contains(point)&& quitButtonAction!= nil { 
quitButtonAction!()
}

现在,如果我们设置quitButtonAction闭包,则从这一点开始调用它。

要设置quitButtonAction关闭,我们需要转到GameScene.swift 。 在sceneDidLoad()中,我们可以将HUD设置替换为以下代码:

最后的想法

这是最初的五部分教程的最后一课,但是该游戏仍有很多工作要做。 以下是我将其上传到商店之前打算做的事情:

  • 添加图标和启动屏幕
  • 完成主菜单(在本教程中已简化)
  • 错误修复,包括流氓雨滴和多种食物生成
  • 重构和优化代码
  • 游戏的调色板根据得分而变化
  • 根据分数更新难度
  • 食物正上方时为猫制作的动画
  • 游戏中心整合
  • 积分(包括对音乐曲目的正确积分)

跟踪我们的GitHub,因为将来会进行这些更改。 另外,请务必在AppStore中签出完成的项目。 如果您对代码有任何疑问,请随时给我们发送电话: hello@thirteen23.com ,我们可以讨论问题。 如果某些主题引起足够的关注,也许我们可以再写一篇讨论该主题的文章。

谢谢!

我要感谢在创建游戏过程中提供帮助的所有人员以及相关的文章。

  • 凯瑟琳·罗(Cathryn Rowe)-用于初始艺术作品,设计以及编辑/发布我们车库中的文章
  • Morgan Wheaton-用于最终菜单设计和调色板(一旦我真正实现了这些功能,这将很棒,请继续关注)
  • Nikki Clark —用于文章中的出色标题和分隔符,并帮助编辑文章
  • 劳拉·莱维萨(Laura Levisay)-用于文章中的所有棒极了的gif并向我发送可爱的猫gif以鼓舞士气
  • 汤姆·哈德森(Tom Hudson)-没有他,这个系列根本就不会制作,并且对于编辑我的文章有帮助
  • Lani DeGuire-如需帮助编辑我的文章,第1-4课,这是很多工作。
  • 杰夫·穆恩(Jeff Moon)—帮助编辑第5课和乒乓球。 很多乒乓球。

认真地花了很多人才能准备好一切,将其推向Medium,并将其发布到商店。

谢谢大家也读过这句话。

RainCat:第1课
如何在Swift 3 medium.com中制作简单的SpriteKit游戏 RainCat:第2课
如何在Swift 3 medium.com中制作简单的SpriteKit游戏 RainCat:第3课
如何在Swift 3 medium.com中制作简单的SpriteKit游戏 RainCat:第4课
如何在Swift 3 medium.com中制作简单的SpriteKit游戏

Facebook Twitter上 找到我们, 或者在 thirteen23.com 我们 联系