2021SC@SDUSC
一、前言
1.说明
audio 说明文档地址
audio package - github.com/hajimehoshi/ebiten/v2/audio - pkg.go.dev
本文中所有截图和代码均来自说明文档或 ebiten 源文件
笔者负责 audio 音频相关的代码分析
2.梗概
解析 examples 包下的 wav 中的例子。
二、效果解析
1.启动后
一个大小不可调节的显示框,提示按 P 键播放 wav。
2.行为
第一次按 P 键后,等待一段时间。
显示的文字变为 “Bump!”,并且会有一次短暂的鼓声,所以这个 wav 文件就是一次击鼓的声音。
之后按 P 键,延迟比第一次低了很多,猜测因为第一次需要加载,解码音频文件。
并且过快的按压 P 键会有部分操作丢失,猜测有锁保护线程。
三、代码
创建一个新游戏。
初始化音频上下文。
解码 wav 格式的数据并检索解码的 PCM 流。
创建一个有一个流的 audio.Player 。
func NewGame() (*Game, error) {
g := &Game{}
var err error
g.audioContext = audio.NewContext(sampleRate)
d, err := wav.Decode(g.audioContext, bytes.NewReader(raudio.Jab_wav))
if err != nil {
return nil, err
}
g.audioPlayer, err = g.audioContext.NewPlayer(d)
if err != nil {
return nil, err
}
return g, nil
}
Update()
包含两个方法:倒带、播放。
和效果表现相符。
由于audioPlayer只有一个流并记住播放位置,重复使用audioPlayer时,播放前需要倒带。
Draw 方法。
展示文字。
Layout,返回尺寸。
main 大同小异,创建游戏,设置窗口大小和标题,RunGame。
3.关键点
有两个地方需要注意:
- 监听事件在哪里?
- 鼓声文件在哪里传入?
- 如何显示不同文字?
对于第一个问题,看 Update。
这里等效一个监听事件,KeyP – P
inpututil.IsKeyJustPressed(ebiten.KeyP)
那么我们可以修改这里更改监听事件。
对于第二个问题,在 NewGame 中
这里使用了嵌入式资源 Jab_wav。
位置:
这一句解码可以改为:
// 先打开文件
f, err := os.Open("jab.wav")
if err != nil {
return err
}
d, err := wav.Decode(g.audioContext, f)
对于第三个问题,Draw 中获得播放状态。