gas-station-sim/asset/asset.go

116 lines
2.7 KiB
Go

package asset
import (
"embed"
"image"
"io"
_ "image/jpeg"
_ "image/png"
"code.rocketnine.space/tslocum/gas-station-sim/world"
"github.com/hajimehoshi/ebiten/v2"
"github.com/hajimehoshi/ebiten/v2/audio"
"github.com/hajimehoshi/ebiten/v2/audio/vorbis"
)
//go:embed image sound
var fs embed.FS
var (
ImageInterior = interiorImage()
ImageExterior = exteriorImage()
ImageCursor = LoadImage("image/cursor.png")
ImageCustomerFrontMale = LoadImage("image/s_front_male.png")
ImageCustomerFrontFemale = LoadImage("image/s_front_female.png")
ImageDollarTwo = LoadImage("image/dollar_two.jpg")
ImageDollarTwenty = LoadImage("image/dollar_twenty.jpg")
)
const sampleRate = 44100
var (
audioContext = audio.NewContext(sampleRate)
SoundChime = LoadOGG(audioContext, "sound/chime.ogg", false)
SoundHelloAndWelcome = LoadOGG(audioContext, "sound/hello-and-welcome.ogg", false)
SoundOnPumpMale = LoadOGG(audioContext, "sound/on-pump-male.ogg", false)
SoundOnPumpFemale = LoadOGG(audioContext, "sound/on-pump-female.ogg", false)
SoundEightMale = LoadOGG(audioContext, "sound/eight-male.ogg", false)
SoundEightFemale = LoadOGG(audioContext, "sound/eight-female.ogg", false)
SoundTwentyMale = LoadOGG(audioContext, "sound/twenty-male.ogg", false)
SoundTwentyFemale = LoadOGG(audioContext, "sound/twenty-female.ogg", false)
)
func interiorImage() *ebiten.Image {
img := LoadImage("image/interior.jpg")
n := ebiten.NewImage(world.ScreenWidth, world.ScreenHeight)
op := &ebiten.DrawImageOptions{}
op.GeoM.Scale(0.64, 0.64)
op.GeoM.Translate(-42, -42)
n.DrawImage(img, op)
return n
}
func exteriorImage() *ebiten.Image {
img := LoadImage("image/exterior.jpg")
n := ebiten.NewImage(world.ScreenWidth, world.ScreenHeight)
op := &ebiten.DrawImageOptions{}
op.GeoM.Scale(0.9, 0.9)
op.GeoM.Translate(-23, -2)
n.DrawImage(img, op)
return n
}
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 LoadOGG(context *audio.Context, p string, loop bool) *audio.Player {
f, err := fs.Open(p)
if err != nil {
panic(err)
}
defer f.Close()
stream, err := vorbis.DecodeWithSampleRate(sampleRate, f)
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
}