我是靠谱客的博主 鲜艳玉米,最近开发中收集的这篇文章主要介绍ebiten 学习(10)-loop.go一、前言二、loop,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部