2024-02-06 15:26:20 +01:00
|
|
|
package assets
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"embed"
|
|
|
|
|
"image"
|
|
|
|
|
_ "image/png"
|
|
|
|
|
"log"
|
2024-02-13 18:42:13 +01:00
|
|
|
"log/slog"
|
2024-02-06 15:26:20 +01:00
|
|
|
"path/filepath"
|
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
|
|
"github.com/hajimehoshi/ebiten/v2"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// Maps image name to image data
|
|
|
|
|
type AssetRegistry map[string]*ebiten.Image
|
|
|
|
|
|
2024-03-10 13:05:31 +01:00
|
|
|
//go:embed sprites/*.png fonts/*.ttf levels/*.ldtk
|
2024-02-06 15:26:20 +01:00
|
|
|
var assetfs embed.FS
|
|
|
|
|
|
|
|
|
|
var Assets = LoadImages("sprites")
|
|
|
|
|
|
|
|
|
|
func LoadImages(dir string) AssetRegistry {
|
|
|
|
|
images := AssetRegistry{}
|
|
|
|
|
|
|
|
|
|
// we use embed.FS to iterate over all files in ./assets/
|
|
|
|
|
entries, err := assetfs.ReadDir(dir)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatalf("failed to read assets dir %s: %s", dir, err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, imagefile := range entries {
|
2024-03-21 09:38:47 +01:00
|
|
|
path := filepath.Join(dir, imagefile.Name())
|
|
|
|
|
fd, err := assetfs.Open(path)
|
2024-02-06 15:26:20 +01:00
|
|
|
if err != nil {
|
|
|
|
|
log.Fatalf("failed to open image file %s: %s", imagefile.Name(), err)
|
|
|
|
|
}
|
|
|
|
|
defer fd.Close()
|
|
|
|
|
|
|
|
|
|
name := strings.TrimSuffix(imagefile.Name(), ".png")
|
|
|
|
|
|
|
|
|
|
img, _, err := image.Decode(fd)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatalf("failed to decode image %s: %s", imagefile.Name(), err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
images[name] = ebiten.NewImageFromImage(img)
|
2024-02-13 18:42:13 +01:00
|
|
|
|
|
|
|
|
slog.Debug("loaded asset", "path", path)
|
2024-02-06 15:26:20 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return images
|
|
|
|
|
}
|