boxbrawl/asset/asset.go

117 lines
2.2 KiB
Go
Raw Permalink Normal View History

2023-01-24 06:29:04 +00:00
package asset
import (
2023-02-01 18:04:41 +00:00
"bytes"
2023-01-24 06:29:04 +00:00
"embed"
"image"
2023-02-01 18:04:41 +00:00
"io"
2023-01-24 06:29:04 +00:00
2023-02-01 18:45:53 +00:00
_ "image/png"
2023-01-24 06:29:04 +00:00
"github.com/hajimehoshi/ebiten/v2"
2023-02-01 18:04:41 +00:00
"github.com/hajimehoshi/ebiten/v2/audio"
"github.com/hajimehoshi/ebiten/v2/audio/vorbis"
2023-02-01 18:45:53 +00:00
"github.com/hajimehoshi/ebiten/v2/audio/wav"
2023-01-24 06:29:04 +00:00
)
2023-02-01 18:04:41 +00:00
//go:embed image sound
2023-01-24 06:29:04 +00:00
var FS embed.FS
const tileSize = 64
var ImgPlayer = LoadImage("image/player.png")
2023-02-01 18:04:41 +00:00
const sampleRate = 44100
2023-02-01 18:45:53 +00:00
var (
audioContext = audio.NewContext(sampleRate)
SoundHitP1 = LoadWAV(audioContext, "sound/hit.wav")
SoundHitP2 = LoadWAV(audioContext, "sound/hit.wav")
SoundMusic = LoadOGG(audioContext, "sound/an_individual_who_fights_on_roads.ogg", true)
)
2023-02-01 18:04:41 +00:00
2023-01-24 06:29:04 +00:00
func LoadImage(p string) *ebiten.Image {
f, err := FS.Open(p)
if err != nil {
panic(err)
}
defer f.Close()
baseImg, _, err := image.Decode(f)
if err != nil {
panic(err)
}
return ebiten.NewImageFromImage(baseImg)
}
func LoadBytes(p string) []byte {
b, err := FS.ReadFile(p)
if err != nil {
panic(err)
}
return b
}
2023-02-01 18:45:53 +00:00
func LoadWAV(context *audio.Context, p string) *audio.Player {
f, err := FS.Open(p)
if err != nil {
panic(err)
}
defer f.Close()
stream, err := wav.DecodeWithSampleRate(sampleRate, f)
if err != nil {
panic(err)
}
player, err := context.NewPlayer(stream)
if err != nil {
panic(err)
}
// Workaround to prevent delays when playing for the first time.
player.SetVolume(0)
player.Play()
player.Pause()
player.Rewind()
player.SetVolume(1)
return player
}
2023-02-01 18:04:41 +00:00
func LoadOGG(context *audio.Context, p string, loop bool) *audio.Player {
b := LoadBytes(p)
stream, err := vorbis.DecodeWithSampleRate(sampleRate, bytes.NewReader(b))
if err != nil {
panic(err)
}
var s io.Reader
if loop {
s = audio.NewInfiniteLoop(stream, stream.Length())
} else {
s = stream
}
player, err := context.NewPlayer(s)
if err != nil {
panic(err)
}
// Workaround to prevent delays when playing for the first time.
player.SetVolume(0)
player.Play()
player.Pause()
player.Rewind()
player.SetVolume(1)
return player
}
2023-01-24 06:29:04 +00:00
func FrameAt(img *ebiten.Image, x int, y int) *ebiten.Image {
xPos, yPos := x*tileSize, y*tileSize
return img.SubImage(image.Rect(xPos, yPos, xPos+tileSize, yPos+tileSize)).(*ebiten.Image)
}