概述
2021SC@SDUSC
目录
- 一、前言
- 1.说明
- 2.梗概
- 二、loop
- 1.主要方法
- 2.用例
一、前言
1.说明
audio 说明文档地址
audio package - github.com/hajimehoshi/ebiten/v2/audio - pkg.go.dev
本文中所有截图和代码均来自说明文档或 ebiten 源文件
笔者负责 audio 音频相关的代码分析
2.梗概
阅读 loop.go 的代码,分析大概的逻辑和功能。
二、loop
1.主要方法
InfiniteLoop 表示一个永不结束的循环流。
NewInfiniteLop 根据源流创建一个新的无限循环流,长度以字节为单位。
NewInfiniteLopWithIntro 创建一个新的带有 前缀 部分的无限循环流。
NewInfiniteLopWithIntro 接受源流 src、introLength(字节)和loopLength(字节)。
返回长度,前缀长度加循环长度
确认流的位置无误。
Read 方法是 ReadSeekCloser 中 Read 方法的实现。
Seek 同上,也是 Seek 的实现。
2.用例
详见之前的博客“无限循环播放器”。
使用解码的字节创建一个无限循环流。
s 是一个 ReadCloser 流,也是一个 Seeker 流。
我自己写的例子
//go:build linux || darwin || windows
// +build linux darwin windows
package main
import (
"bytes"
"fmt"
"log"
"time"
//myogg "./res"
"github.com/hajimehoshi/ebiten/v2"
"github.com/hajimehoshi/ebiten/v2/audio"
"github.com/hajimehoshi/ebiten/v2/audio/vorbis"
"github.com/hajimehoshi/ebiten/v2/ebitenutil"
)
const (
screenWidth = 640
screenHeight = 480
sampleRate = 22050
introLengthInSecond = 5
loopLengthInSecond = 10
)
type Game struct {
player *audio.Player
audioContext *audio.Context
}
func (g *Game) Update() error {
if g.player != nil {
return nil
}
if g.audioContext == nil {
g.audioContext = audio.NewContext(sampleRate)
}
// 解码ogg
oggS, err := vorbis.Decode(g.audioContext, bytes.NewReader(TJF))
if err != nil {
return err
}
// 套一层无限循环的壳
s := audio.NewInfiniteLoopWithIntro(oggS, introLengthInSecond*4*sampleRate, loopLengthInSecond*4*sampleRate)
g.player, err = g.audioContext.NewPlayer(s)
if err != nil {
return err
}
// 播放
g.player.Play()
return nil
}
func (g *Game) Draw(screen *ebiten.Image) {
pos := g.player.Current()
if pos > 5*time.Second {
pos = (g.player.Current()-5*time.Second)%(10*time.Second) + 5*time.Second
}
msg := fmt.Sprintf(`TPS: %0.2f
Mr.tang jiafeng's best wish
intro: 0[s] - %[2]d[s]
loop: %[2]d[s] - %[3]d[s]
current: %0.2[4]f[s]`, ebiten.CurrentTPS(), introLengthInSecond, introLengthInSecond+loopLengthInSecond, float64(pos)/float64(time.Second))
ebitenutil.DebugPrint(screen, msg)
}
func (g *Game) Layout(outsideWidth, outsideHeight int) (int, int) {
return screenWidth, screenHeight
}
func main() {
ebiten.SetWindowSize(screenWidth, screenHeight)
ebiten.SetWindowTitle("MyOggDemo1")
if err := ebiten.RunGame(&Game{}); err != nil {
log.Fatal(err)
}
}
最后
以上就是鲜艳玉米为你收集整理的ebiten 学习(10)-loop.go一、前言二、loop的全部内容,希望文章能够帮你解决ebiten 学习(10)-loop.go一、前言二、loop所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复