package asset import ( "bytes" "embed" "image" "io" _ "image/png" "github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2/audio" "github.com/hajimehoshi/ebiten/v2/audio/vorbis" "github.com/hajimehoshi/ebiten/v2/audio/wav" ) //go:embed image sound var FS embed.FS const tileSize = 64 var ImgPlayer = LoadImage("image/player.png") const sampleRate = 44100 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) ) 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 } 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 } 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 } 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) }