前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用Go和Korok写一个Flappybird游戏5-如何播放音效

用Go和Korok写一个Flappybird游戏5-如何播放音效

作者头像
李海彬
发布2019-05-08 10:45:50
7220
发布2019-05-08 10:45:50
举报
文章被收录于专栏:Golang语言社区Golang语言社区

作者:ntop 链接:https://www.jianshu.com/p/36dea455bfc1 来源:简书

上一节 我们给游戏添加了场景转换支持,现在游戏逻辑已经基本完善,唯一剩下的就是音效了。本节会添加音效支持,这也是这一系列的最后一节。本节你会学会:如何播放音效.

注:如果你没有完成上一节的教程,也可以直接从 这里 下载到上节结束时的代码,以便开始本节的内容。

音频资源

在 Korok 中,只支持两种基本的音频格式:wav 和 ogg/vorbis. 前者是原声的未压缩音频格式比较适合于播放音效,后者是经过压缩的音频格式比较适合于播放比较长的背景音乐。在工程的 assets/sound/ 目录中,我们已经准备几个音频文件,不过这些文件都是音效(在本游戏中并不需要背景音乐)。

读取音效文件可以在 GameSceneLoad 方法中执行:

代码语言:javascript
复制
1asset.Audio.Load("sound/rise.ogg", false)
2    asset.Audio.Load("sound/drop.ogg", false)
3    asset.Audio.Load("sound/point.ogg", false)
4    asset.Audio.Load("sound/collision.ogg", false)
5    asset.Audio.Load("sound/swooshing.ogg", false)

上面代码把音频文件加载到了内存,需要注意的是第二个参数,这个参数指定了当前音频是直接载入内存还是以流文件的方式加载。对 Flappy Bird 来说,这些文件都是比较短小的音效,所以直接载入内存是没有问题的。

代码语言:javascript
复制
 1// 在 GameScene 中添加属性 
 2type GameScene struct {
 3    ...
 4    sound struct{
 5        rise uint16
 6        drop uint16
 7        collision uint16
 8        point uint16
 9        swooshing uint16
10    }
11}
12// 在 OnEnter 中初始化
13sn.sound.rise, _ = asset.Audio.Get("sound/rise.ogg")
14sn.sound.drop, _ = asset.Audio.Get("sound/drop.ogg")
15sn.sound.point, _ = asset.Audio.Get("sound/point.ogg")
16sn.sound.collision, _ = asset.Audio.Get("sound/collision.ogg")
17sn.sound.swooshing, _ = asset.Audio.Get("sound/swooshing.ogg")

需要注意的是,直接加载仅内存的音频是可以用 audio.PlayEffect() 播放发的,但是以流的形式加载的不可以。以流的形式加载的只能用 audio.PlayMusic 播放, 这是 Korok 音频系统的一个约定。

播放音频

播放音频是非常简单的,直接在触发事件的时候调用 Play 方法即可。比如,点击屏幕的时候会给鸟一个向上的冲量,同时会播放一个 “呼——” 的音效:

代码语言:javascript
复制
1 if input.PointerButton(0).JustPressed() {
2        sn.bird.vy = TapImpulse
3        // play effect
4        audio.PlayEffect(sn.sound.rise, 1)
5    }

由于简书是不能播放视频的,所以效果无法感受了。大概就是每次飞的时候会 “呼——” 的一声。

在碰撞和坠落的时候也加上音效:

代码语言:javascript
复制
 1if sn.bird.state != Dead {
 2        ps.StopScroll()
 3        sn.bird.state = Dead
 4
 5        // stop bird animation
 6        korok.Flipbook.Comp(sn.bird.Entity).Stop()
 7
 8        // play collision
 9        audio.PlayEffect(sn.sound.collision, 1)
10    }
11
12    // detect collision with ground and sky
13    if y := sn.bird.Vec2[1]; y > 480 {
14        sn.bird.Vec2[1] = 480
15    } else if y < 100 {
16        y = 100; sn.state = Over
17
18        if sn.bird.state != Dead {
19            sn.bird.state = Dead
20            korok.Flipbook.Comp(sn.bird.Entity).Stop()
21            audio.PlayEffect(sn.sound.collision, 1)
22        }
23
24        audio.PlayEffect(sn.sound.drop, 2)
25        sn.bounceTween.Animator().Forward() // 如何
26   }

以上代码在坠落和死亡的时候,分别播放了音效。值得注意的是,播放音效的方法: audio.PlayEffect(sn.sound.collision, 1) 的第二个参数是一个优先级。在这个游戏中,音效比较少几乎用不到,但在有大量音效的游戏中,可能会使用这些优先级参数来调整音频的重要程度。最终的效果:

经过5个小节,FlappyBird 系列教程终于结束了,它基本上涵盖了 Korok 引擎 70~80% 的功能,只有粒子系统和一些隐藏功能没有被提及。代码已经传到 GitHub - ntop001/flappybird,关注 master 分支。

零几年的时候刚上大学,那会在图书馆的角落发现一本叫C语言的书,从此便开始了编码人生,那会经常着迷于折腾一些代码编写小游戏,比如俄罗斯方块、连连看。十几年过去了经历了项目的压力、业务的枯燥,有时候在周末想自己写些代码却不知道写些什么。希望经此教程你可以学会用 Korok 引擎做一些小游戏,重拾编写游戏的乐趣。


版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 音频资源
  • 播放音频
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档