栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

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

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

2021SC@SDUSC

目录
  • 一、前言
    • 1.说明
    • 2.梗概
  • 二、效果解析
    • 1.启动后
    • 2.行为
  • 三、代码
    • 3.关键点


一、前言 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 中获得播放状态。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/990589.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号