ebiten 学习(12)-wav 实例解析,音乐画面反馈

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.关键点

有两个地方需要注意:

  1. 监听事件在哪里?
  2. 鼓声文件在哪里传入?
  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 中获得播放状态。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值