RainCat:第4课

如何在Swift 3中制作一个简单的SpriteKit游戏

再一次问好! 如果您错过了上一课,可以在这里查看。 如果您没有第3课中的代码,当前可在GitHub上获得。

在上一课中,我们添加了大部分资产,最后使用zPosition属性正确定位了它们。 我们增加了猫的功能,以及在猫掉到屏幕上造成一定危险时重新生成猫的功能。 接下来,我们在屏幕上的任意位置生成食物,但是在屏幕的两侧都留有边距,因此不会太靠近屏幕边缘。 我们为这两个精灵添加了碰撞,并且只在用伞将猫推到那里时,猫才能够收集食物。 也就是说,直到今天!

在本课程中,我们将重点关注:

  • 将猫移向食物
  • 动画猫
  • 遇雨会损坏
  • 添加声音效果
  • 添加音乐

获取您的资产!

今天的资产可在GitHub上找到。 就像之前三课中一样,将图像再次拖到Assets.xcassets中 。 稍后我们将添加声音效果和音乐。

让我们继续前进!

让我们的猫动起来并不难。 我们不会通过触摸屏幕来与猫互动,这是我们当前移动雨伞的方式。 相反,猫会根据食物的当前位置移动。 目前,我们的食物精灵已添加到场景中并被遗忘,但是每次调用更新时我们都需要知道食物的确切位置,以使猫指向正确的方向移动。

回到我们的GameScene.swift ,让我们在文件顶部的本地cat变量下面添加一个变量:

 私人食品:FoodSprite! 

然后,我们可以更新spawnFood函数以在每次生成食物时设置此变量。

spawnFood函数中,替换为:

 让食物= FoodSprite.newInstance() 

与:

 食物= FoodSprite.newInstance() 

这会将food变量的范围从spawnFood函数更改为GameScene文件的范围。 现在,我们需要编辑CatSprite文件,以了解它朝食物移动的方向。 要获得食物,我们需要知道我们可以朝着什么速度前进。 在CatSprite.swift文件的顶部,我们可以在newInstance函数上方添加以下代码行。

 私人让步速度:CGFloat = 100 

这条线是我们的移动速度,它是对非常复杂的问题的非常简单的解决方案。 我们在这里仅使用一个简单的线性方程,而忽略了摩擦或加速度会带来的任何复杂性。

现在,我们需要使用update(deltaTime 🙂方法做一些事情。 因为我们将知道食物在哪里,所以我们需要朝该位置移动。 用以下代码替换CatSprite.swift中的更新函数:

接下来,我们可以添加行走动画! 之后,我们将向后转圈以修复猫受到打击后的旋转。 您可能已经注意到,有一个名为“ cat_two”的未使用资产。 我们需要拉动该纹理并将其交换出去,以使其看起来就像猫在走路。 为此,我们将添加第一个SKAction!

与风格同行!

CatSprite的顶部,我们将添加一个字符串常量,以便我们可以添加与此键关联的行走动作。 这样,我们就可以停止步行动作,而无需删除以后可能在猫身上执行的所有动作。 在MovementSpeed变量上方添加以下行:

 私人let WalkingActionKey =“ action_walking” 

字符串本身并不是很重要,但是对于此行走动画来说是唯一的。 我还喜欢为密钥添加有意义的内容,以便进行调试。 例如,如果我看到按键,我将知道它是SKAction,特别是步行动作。

walkingActionKey下面,我们将添加框架。 由于我们将只使用两个框架,因此我们可以在文件顶部执行此操作,而不会显得太凌乱:

 私人让walkFrames = [ 
SKTexture(imageNamed:“ cat_one”),
SKTexture(imageNamed:“ cat_two”)
]

这只是我们在行走时将在两个纹理之间切换的数组。 要完成此操作,我们将update (deltaTime:foodLocation 🙂函数更新为以下代码:

如果猫被打,它将旋转但仍朝食物移动。 我们需要给猫咪显示一个损坏的状态,以便我们知道自己做了不好的事情。 另外,我们需要纠正猫在移动时的旋转,以免其侧卧或倒立行走。

让我们仔细研究一下计划。 我们希望向用户显示猫被打了,而不是稍后更新分数。 某些游戏会在闪烁时使该单位无敌。 如果我们得到纹理,我们也可以做一个损坏动画。 对于此游戏,我想使事情保持简单,因此我将添加一些用于flailing的功能。 这只猫在被雨淋时会被惊呆,甚至难以置信地向后滚动。 猫被吓到了 ,你会让这种情况发生。 为此,我们将设置一些变量。 我们需要知道猫会被眩晕多长时间以及它被眩晕多长时间。 将以下行添加到文件顶部,在MovementSpeed变量下面:

 私人var timeSinceLastHit:TimeInterval = 2 
私人让maxFlailTime:TimeInterval = 2

第一个变量timeSinceLastHit是保存自从猫最后被击打以来已经过了多长时间的变量。 由于下一个变量maxFlailTime ,我们将其设置为两个。 这是常说的话,猫只会被惊呆两秒钟。 两者都设置为两个,以使猫在产卵时不会惊呆。 您可以稍后篡改这些变量以获得最佳的眩晕时间。

现在,我们需要添加一个函数,让猫知道它被打了,并且需要做出反应-通过停止移动。 在我们的update(deltaTime:foodLocation 🙂函数下面添加以下函数:

现在我们添加声音!

在开始编程之前,我们应该研究寻找音效。 通常,在寻找声音效果时,我只是用谷歌搜索类似猫喵免版税的短语。 首次点击通常是soundbible.com,而且他们通常会选择很多免版税的音效。 确保阅读许可证。 如果您从不打算发布该应用,请不要担心许可问题,因为这将是个人使用。 但是,如果您希望在App Store中出售,分发等,请确保使用Attribution 3.0 Creative Commons或类似的东西。 那里有很多许可证,因此在使用他人的作品之前,请确保您知道声音/图像的许可证是什么。

所有这些RainCat声音效果都是知识共享的,可以免费使用。 下一步,将我们先前下载的SFX文件夹移到RainCat文件夹中。

将文件添加到项目中之后,将它们添加到Xcode中的项目中。 在支持下创建一个名为SFX的组。 右键单击组,然后单击“ 将文件添加到“ RainCat””…

找到您的SFX文件夹,选择所有声音效果文件,然后单击“ 添加”按钮。 现在您可以播放音效了。 转到CatSprite.swift ,我们可以添加声音效果文件名的数组,以便在雨滴袭来时播放它们。 在文件顶部的walkFrames变量下面添加以下数组:

 私人让喵喵SFX = [ 
“ cat_meow_1.mp3”,
“ cat_meow_2.mp3”,
“ cat_meow_3.mp3”,
“ cat_meow_4.mp3”,
“ cat_meow_5.wav”,
“ cat_meow_6.wav”
]

通过在hitByRain函数中添加两行,可以使猫发出声音:

 让selectedSFX = Int(arc4random_uniform(UInt32(meowSFX.count))) 
 运行(SKAction.playSoundFileNamed(meowSFX [selectedSFX],waitForCompletion:true)) 

上面的代码选择一个随机数,最小为零,最大为meowSFX数组的大小。 然后,我们从字符串数组中选择声音效果名称,然后播放声音文件。 我们将稍微介绍一下waitForCompletion变量。 此外,我们还使用SKAction.playSoundFileNamed来获得简短而甜美的声音效果。 如果您想获取一些背景音乐,则需要研究AVFoundation。

我们有声音! 我们声音太大了。 我们有声音在播放其他声音。 现在,每当猫下雨时,我们就会播放一种音效。 这变得烦人。 我们需要在播放声音的时间上添加更多逻辑,也不要同时播放两个剪辑。

将这些变量添加到maxSpailTime变量下方的CatSprite.swift文件的顶部

 私人var currentRainHits = 4 
私人让maxRainHits = 4

第一个变量currentRainHits是一个计数器,用于统计击中猫的击中次数, maxRainHits是要发出的击中次数。

现在,我们将更新hitByRain函数。 我们需要为currentRainHitsmaxRainHits应用规则。 将hitByRain函数替换为以下内容:

添加音乐!

在我们创建一种在应用中播放音乐的方法之前,我们需要播放一些东西。 与搜索声音效果类似,您可以在Google上搜索免版税音乐,并且通常可以找到一些东西。 此外,您可以转到SoundCloud并与艺术家交谈。 查看您是否可以达成协议,可以免费使用带有署名的音乐,也可以付费购买在游戏中使用音乐的许可。 在这个应用程序中,我碰巧遇到了bensound.com,并且使用了知识共享许可,他们可以使用一些音乐。 要使用它,您必须遵循其许可协议。 非常简单:您必须将其贷记或支付许可证费用。

下载所有4首曲目1 2 3 4,或将它们从我们先前下载的Music文件夹中移出。 我们将使用它们并在每个轨道之间循环以保持新鲜感。 另外要考虑的是,这些音轨无法正确循环,因此您将知道它的开始和结束时间。 好的背景音乐可以很好地循环播放或变形为另一首曲目。

下载曲目后,在RainCat文件夹下创建一个名为Music的文件夹,与之前创建SFX文件夹的方式相同。 然后将曲目移到该文件夹​​。

然后在我们的项目结构“ 音乐”的“支持”组中创建一个组。 右键单击“音乐”组,然后单击“将文件添加到“ RainCat””,将曲目添加到我们的项目中。

接下来,我们将创建一个名为SoundManager的新文件,如上图所示。 最后,我们可以实现SoundManager:

只是按播放

既然我们已经完成了对SoundManager的解释,我们只需要告诉它启动即可,并且音乐将永远循环播放。 快速运行到GameViewController.swift并将以下代码行放置在我们第一次设置场景的位置:

  SoundManager.sharedInstance.startPlaying() 

之所以在GameViewController中执行此操作,是因为我们希望音乐独立于场景。 如果我们此时运行该应用程序,并且所有内容均已正确添加到项目中,那么我们现在将为我们的游戏提供背景音乐!

在本课程中,我们谈到了两个主要主题: 精灵动画和声音。 我们使用了基于帧的动画来对我们的精灵进行动画处理,使用SKActions来进行动画处理,并使用方法来校正被雨淋到的猫。 我们使用SKActions添加了声音效果,并分配了它们在猫被雨水击中时播放。 最后,我们为游戏添加了初始背景音乐。

对于那些在课程中取得如此成就的人,表示祝贺! 我们的游戏即将完成! 如果您错过了一步,或者一路感到困惑,请在GitHub上查看本课程的最终代码。

你怎么做的? 您的代码看起来几乎和我的完全一样吗? 发生了什么变化? 您是否将代码更新得更好? 在下面的评论中让我知道。

接下来的第5课!

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

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