介绍

在本教程中,这是SpriteKit From Scratch系列的第四部分,我们看一下SpriteKit提供的各种视觉和音频功能,这些功能可以为您的游戏添加更多细节和多样性。 这包括粒子系统,滤镜,照明和音频。

要跟我一起学习,您可以使用在本系列上一教程中创建的项目,也可以从GitHub下载新副本。

本系列中用于游戏的图形可以在GraphicRiver上找到 。 GraphicRiver是查找游戏插图和图形的绝佳资源。

1.粒子系统

在SpriteKit中,术语“粒子系统”   引用单个发射器节点,由SKEmitterNode类表示。 它定义了系统在场景中的位置及其创建的所有粒子。 发射器指定其生成的粒子的各种行为。

粒子系统最适合在SpriteKit游戏中使用,您需要生成大量相同或相似的Sprite,而无需指定特定位置或执行任何动作。

在本教程中,我们将在汽车撞到障碍物时添加两个粒子系统:

  • 短暂出现的短暂爆炸效果
  • 无限期保留在场景中的烟雾效果

尽管可以通过编程方式创建粒子系统,但是使用Xcode的内置编辑器则更容易做到。 可以在此编辑器中修改粒子系统的所有属性,并且您所做的更改将立即可视化。 这比每次做出更改后都必须运行游戏要容易得多。

我们首先要创建爆炸效果。 在项目中创建一个新文件,然后选择“ iOS”>“资源”>“ SpriteKit粒子文件”模板。


从出现的菜单中,选择“ 火”作为“ 粒子”模板 。 将该文件命名为Explosion或类似名称。


Xcode创建文件后,您会看到项目中有两个新文件Explosion.sksspark.png


Explosion.sks包含粒子系统,这是我们将要使用的文件。 第二个文件spark.pngFire粒子模板用来创建其视觉效果的简单图像。 如果打开Explosion.sks ,则可以看到火焰动画。


我们需要对该粒子系统进行的最重要的更改是使粒子在所有方向上从发射器向外移动,并且不连续产生新粒子。

要进行第一次更改,请打开“ 属性”检查器 ,然后在“ 粒子”部分下,将“ 角度范围”更改为360°


立刻,您可以看到粒子现在以圆形向外移动。


要阻止粒子系统连续创建新粒子,我们可以指定一个最大值 。 该值告诉粒子系统总共应创建多少个粒子。 默认值0表示没有最大值,这将导致连续创建新粒子。

除了指定最大值之外,我们还将更改其他一些属性以创建更好的爆炸效果。 在“ 属性”检查器的“ 粒子”部分中,更改以下值:


我们将“ 出生率”设置为大于“ 最大”属性的值,因为它确定了每秒创建多少个粒子。 我们希望爆炸能够很快发生。 因此,我们将1000的出生率指定为1000的出生率 ,而不是在一整秒的时间内生成1000个粒子。 这意味着仅需0.2秒即可创建所有粒子。

通过将“ 生存期”>“开始”设置为3 ,粒子可以存活3秒钟。 寿命范围属性可用于向粒子的寿命添加变化。

最后,我们将“ 速度>开始”(Speed> Start)设置为200 ,以使粒子从发射器飞出的速度非常快,就像真实爆炸中发生的那样。

进行这些更改后,您可以看到粒子系统看起来完全不同,更像是适当的爆炸。


请注意,即使动画在Xcode编辑器中定期循环播放,粒子系统在添加到场景中时也只能动画一次。

爆炸粒子系统完成后,就该转移到烟雾粒子系统了。 使用用于爆炸的模板创建一个新文件Smoke 。 唯一的区别是“ 粒子”模板 ,我们将其设置为“ 烟雾”


我们需要对该粒子系统进行的唯一更改是使烟雾以圆形向外移动而不是向上直线移动。 为此,像我们对爆炸粒子系统所做的那样,将“ 角度”>“范围”属性更改为360° 。 这样做之后,烟雾颗粒系统应如下所示:


准备好两个粒子系统后,我们可以将它们添加到场景中。 为此,我们加载作为SKEmitterNode对象创建的每个文件,然后像常规节点一样将它们添加到场景中。 打开MainScene.swift并用以下代码替换didBeginContact(_:)的实现:

func didBeginContact(contact: SKPhysicsContact) {if contact.bodyA.node == player || contact.bodyB.node == player {if let explosionPath = NSBundle.mainBundle().pathForResource("Explosion", ofType: "sks"),let smokePath = NSBundle.mainBundle().pathForResource("Smoke", ofType: "sks"),let explosion = NSKeyedUnarchiver.unarchiveObjectWithFile(explosionPath) as? SKEmitterNode,let smoke = NSKeyedUnarchiver.unarchiveObjectWithFile(smokePath) as? SKEmitterNode {player.removeAllActions()camera?.removeAllActions()player.hidden = trueplayer.removeFromParent()explosion.position = player.positionsmoke.position = player.positionaddChild(smoke)addChild(explosion)}}
}

与在didBeginContact(_:)的先前实现中didBeginContact(_:) ,我们执行与之前相同的检查,以查看碰撞中涉及的任何节点是否是汽车节点。 然后,我们使用可选绑定获取爆炸和烟雾粒子系统资源文件的路径。 我们使用这些路径从中实例化SKEmitterNode对象。

接下来,我们从摄影机和播放器节点中删除所有动作,并通过从场景中删除它来隐藏播放器节点。 我们将汽车移开,以避免发生更多碰撞,从而导致更多爆炸。

我们还将发射器节点的位置设置为汽车的位置,并将其添加到场景中。 结果,一旦将粒子系统添加到场景中,SpriteKit便立即开始对其进行动画处理。

生成并运行您的游戏。 汽车撞到障碍物后,您应该立即看到爆炸粒子系统。 一旦大火消除,将接着冒烟。


2.场景过滤器和效果节点

在SpriteKit中,有一种特殊类型的节点(由SKEffectNode类表示),可以使用Core Image过滤器对象(由CIFilter类表示)来呈现具有各种效果的子节点。 该SKScene类也是一个子类SKEffectNode ,这意味着你也可以申请一个过滤器,整个场景。

不幸的是,在编写本教程时,iOS 9中存在与这些滤镜和效果节点有关的一些问题。当前,为效果节点启用效果后,其所有子级都将被隐藏,从而导致效果不明显。

即使我们无法在游戏中实现它并看到它的外观,我们仍然可以遍历用于创建效果的代码。 在这种情况下,以下方法是向整个场景添加模糊效果并逐渐使其淡入淡出的示例。

func addBlurFilter() {let blurFilter = CIFilter(name: "CIGaussianBlur")blurFilter?.setDefaults()blurFilter?.setValue(0.0, forKey: "inputRadius")filter = blurFiltershouldEnableEffects = truerunAction(SKAction.customActionWithDuration(1.0, actionBlock: { (node: SKNode, elapsedTime: CGFloat) inlet currentRadius = elapsedTime * 10.0blurFilter?.setValue(currentRadius, forKey: "inputRadius")}))
}

我们创建特定类型的CIFilter对象。 如果您想查看一些可用的其他内置滤镜,请查看《 核心图像滤镜参考》 。 我们确保此过滤器具有所有默认输入值,然后将inputRadius手动设置为0.0 ,这意味着最初没有模糊。

然后,我们将滤镜分配给当前场景的filter属性,并将shouldEnableEffects设置为true以启用它。 最后,我们运行一个自定义的SKAction ,它将滤镜的输入半径逐渐增加到10

希望在将来的iOS版本中,影响效果节点的问题已修复,因为它们提供了一种向SpriteKit场景添加一些非常独特且有趣的效果的方法。

3.光节点

SpriteKit还包括出色的照明系统,可用于使您的场景更加逼真。 灯光非常易于实现,并且是通过使用SKLightNode类创建的。 光源节点定义了某些属性,例如光源的颜色(包括环境颜色)及其在距离上的强度。

在我们的场景中,我们将创建一个附着在汽车上的白光。 该灯将照亮汽车前方的障碍物并产生阴影。

首先,在MainScene类的didMoveToView(_:)方法中创建一个光源。

override func didMoveToView(view: SKView) {...let light = SKLightNode()light.lightColor = UIColor.whiteColor()light.falloff = 0.5player.addChild(light)
}

使用此代码,我们将创建一个新的SKLightNode对象,将其lightColor属性更改为white,并将其falloff属性从默认值1降低0.5

就像在SpriteKit中设置物理碰撞检测时一样,您必须通过使用位掩码来指定哪些灯光与场景中的哪些节点进行交互。 当SpriteKit渲染场景中的灯光时,它在灯光节点的categoryBitMask以及每个其他节点的lightingBitMaskshadowCastBitMask上使用逻辑AND运算符,以确定该特定节点应如何显示。

对于我们的游戏,我们希望障碍物与灯光交互,以便它们在场景中投射阴影。 为此,请在MainScene类的spawnObstacle(_:)方法的末尾添加以下两行:

func spawnObstacle(timer: NSTimer) {...obstacle.lightingBitMask = 0xFFFFFFFFobstacle.shadowCastBitMask = 0xFFFFFFFF
}

通过设置启用所有位的位掩码,障碍物将与场景中的每个灯光发生交互。

生成并运行您的应用程序。 您会看到,当您的汽车在场景中移动时,每个障碍物都有一个动态阴影,该阴影始终指向远离汽车中心的位置。


如您所见,SpriteKit中的灯光非常易于使用,并且可以为场景添加漂亮的效果。

4.音频节点

最后,我们将研究SpriteKit中的音频节点。 音频节点用于向场景添加声音效果。 这些特殊节点由SKAudioNode类表示。 由于SKAudioNodeSKNode子类,因此您可以将它们添加并放置在场景中的任何位置,例如常规节点。

无论您如何安排场景(例如背景音乐),都可以定期播放音频并发出相同的声音(例如,背景音乐),SpriteKit还允许您利用位置音频来创建真正的身临其境的效果。 这是通过为您的场景指定一个listener节点来完成的,声音就是从那里“听到”的。

音频节点默认为位置。 这意味着,如果您不想在特定情况下使用此功能,可以将特定节点的positional属性设置为false

尽管我们不会在游戏中实现此功能,但以下是添加背景音乐节点的示例方法,只要它是场景的一部分就可以循环播放。 在该方法中,我们还添加了一个爆炸声节点,当我们告诉它时便开始播放。

请注意,我们在顶部导入了AVFoundation框架。 这是访问和使用SKAudioNode对象的avAudioNode属性所SKAudioNode 。 如您所见,音频节点非常容易在SpriteKit中设置和使用。

import AVFoundationfunc addAudioNode() {listener = playerlet backgroundMusic = SKAudioNode(fileNamed: "backgroundMusic")backgroundMusic.positional = falselet explosion = SKAudioNode(fileNamed: "explosion")explosion.autoplayLooped = falseaddChild(backgroundMusic)addChild(explosion)do {try explosion.avAudioNode?.engine?.start() // Called when you want to play sound} catch {// Do something with the error}
}

结论

现在,您应该可以轻松使用SpriteKit中的一些更高级的效果,包括粒子系统,滤镜,灯光和音频。 这些效果的结合会极大地影响游戏的外观以及沉浸感。

在本系列的下一个也是最后一个教程中,我们介绍了使用SpriteKit时要牢记的一些最佳实践。 我还将向您展示如何创建纹理地图集和保存/加载场景。

与往常一样,请务必在下面的评论中留下您的评论和反馈。

翻译自: https://code.tutsplus.com/tutorials/spritekit-from-scratch-visual-and-audio-effects--cms-26448

从零开始的SpriteKit:视觉和音频效果相关推荐

  1. Python视频制作 MoviePy框架afx音频效果示例

    MoviePy 是一个用于视频编辑的 Python 模块,可用于视频和 GIF 的基本操作.将一系列图像组合成运动图片的视觉多媒体源. 使用音频 afx 参数功能操作方法. 文章目录 音频效果 音频淡 ...

  2. 如何从零开始系统化学习视觉SLAM?

    由于显示格式问题,建议阅读原文:如何从零开始系统化学习视觉SLAM? 什么是SLAM? SLAM是 Simultaneous Localization And Mapping的 英文首字母组合,一般翻 ...

  3. Au 音频效果参考:诊断

    Au菜单:效果/诊断 Effects/Diagnostic 或者, Au菜单:窗口/诊断 Window/Diagnostic 本效果组的工具仅限于波形编辑器.通过这些工具可快速从音频中去除咔嗒声.扭曲 ...

  4. 如何在Mac上的 iMovie 剪辑中添加音频效果?

    iMovie 剪辑中包括的音频效果可以应用到片段,从而增强影片的声音.那我们如何在Mac上的iMovie 剪辑中添加音频效果呢?快和小编一起来看看详细的图文教程吧! 将音频效果添加到片段 1.在 Ma ...

  5. 华为freebuds 5耳机的空间音频效果怎么样?

    大家的freebuds 5耳机的空间音频效果怎么样?效果不明显.没有头动感觉,空间感弱--.??? 据体验freebuds 5开启空间音频后,听音效果是固定的,不像上一款freebudspro2一样支 ...

  6. 技术干货 | 网易云信音视频通话产品中的音频效果功能

    导读:音频效果器一般是指某些通过改变声音信号来实现某些特殊效果的设备或者算法模块.随着直播.短视频等应用的爆发,娱乐应用中对音频效果器的需求也受到越来越多的关注. 文|陈耀斌 网易智企云信音视频开发专 ...

  7. FreeBuds Pro 2开了空间音频效果不明显、卡顿、头部跟踪不灵敏或有延迟、音质差是怎么回事?

    效果不明显.卡顿.头部跟踪不灵敏或有延迟.音质差--.你的华为FreeBuds Pro 2开了空间音频会有这些小问题吗?该如何解决呢?一起来看看! | 及时更新耳机版本 新版本能修复一些小bug啥的, ...

  8. SpriteKit:模拟器中播放效果音有延时的解决办法

    以下代码在模拟器(Xcode 8.1 + iPhone7)中运行会在第一次播放效果音时有半秒到1秒(甚至更长!)的延时,随后再播放就没有延时了: let sound = SKAction.playSo ...

  9. 零基础从零开始写VO视觉里程计

    零基础从零开始写VO代码 课程以直播写代码讲理论为主, 提升代码编程能力和VO视觉里程计理论知识. 数学基础:微分积分.线性代数.矩阵论.统计学.概率论.最优化等 操作系统:Linux(Ubuntu) ...

最新文章

  1. 每日一皮:客户期望 vs 最终产品
  2. java文件服务器开源,附架构师必备技术详解
  3. 超出网络bios会话限制_?老旧BIOS说再见,拯救者系列设置超简单
  4. CNN卷积神经网络深度解析
  5. 用PHP去掉文件头的Unicode签名(BOM)
  6. JS 获取浏览器信息,给出友情提示,避免部分兼容性问题
  7. Git 工作区恢复暂存区操作总览
  8. 累加器A用c语言,累加器A的主要作用是什么_一文解析累加器a和acc的区别
  9. coordinatorlayout_一篇文章学会Coordinatorlayout+AppbarLayout
  10. python爬虫下一页_Python爬虫怎么获取下一页的URL和网页内容?
  11. AVOD-代码理解系列(四)
  12. python微信群聊机器人_python 群聊 机器人
  13. 官版树莓派Pi Pico和YD-RP2040版本对比
  14. C语言 牛顿法 解方程,如何用科学计算器求方程的解(牛顿法解方程具体步骤)...
  15. 如何使广告条自动运行,仅供学习参考
  16. 电信猫的无线无法连接服务器,光纤猫连接路由器无法上网怎么办
  17. 有哪些好用的视频录制工具?
  18. 差分隐私-整理-知乎
  19. 利用python爬取京东平台评论及图片并进行分析
  20. Pytorch系列笔记(六)

热门文章

  1. 开榨油店的失败教训_这才是真正的开榨油坊的风险!千万不能这么做!
  2. PCB上10A的电流需要走多宽的线?需要几个过孔?
  3. 政企专属的IM即时通讯平台,促进团队安全沟通与协作
  4. ruckus 设置OPTION43 实现设备自动注册
  5. flutter 加.then方法
  6. distinct 用法
  7. wincc画面图层的显示和隐藏
  8. Mysql数据库的安适设置、适用妙技名堂
  9. 自动调整图片方向并划窗剪裁
  10. 学习笔记 --- KF、EKF、IKF、ESIKF 公式推导 --Part 2