project-ely/internal/game/sprite/spritesheet_cache.go

92 lines
1.9 KiB
Go

package sprite
import (
"log"
"github.com/veandco/go-sdl2/sdl"
)
const (
PENGUIN = "assets/images/penguin.png"
PERCYWALKING = "assets/images/percywalking.png"
PLATFORMER_FOREST_CHARACTERS = "assets/images/a-platformer-in-the-forest/characters.png"
DELILAHWALKING = "assets/images/Delilah_walking.png"
KINGWALKING = "assets/images/King_walking.png"
)
var fileList []string = []string{
PENGUIN,
PERCYWALKING,
PLATFORMER_FOREST_CHARACTERS,
DELILAHWALKING,
KINGWALKING,
}
var (
spriteCache map[string]*spritesheet
defaultSprite *spritesheet
)
func InitSpriteCache(renderer *sdl.Renderer) error {
spriteCache = make(map[string]*spritesheet)
for _, filename := range fileList {
s, err := NewSprite(renderer, filename)
if err != nil {
log.Printf("error creating sprite %v, using DefaultSprite: %v", filename, err)
defaultSprite, err = createDefaultSprite(renderer)
if err != nil {
log.Printf("failed to create DefaultSprite: %v", err)
return err
}
spriteCache[filename] = defaultSprite
} else {
spriteCache[filename] = s
}
}
return nil
}
func GetSpritesheet(filename string) *spritesheet {
s, exists := spriteCache[filename]
if !exists {
log.Printf("no sprite found for %v, using DefaultSprite", filename)
return defaultSprite
}
return s
}
func CleanupSpriteCache() {
for _, v := range spriteCache {
defer v.Cleanup()
}
}
// The DefaultSprite is just a 100x100 black square
func createDefaultSprite(renderer *sdl.Renderer) (*spritesheet, error) {
var err error
surface, err := sdl.CreateRGBSurface(0, 100, 100, 32, 0, 0, 0, 0)
if err != nil {
return nil, err
}
texture, err := renderer.CreateTextureFromSurface(surface)
if err != nil {
return nil, err
}
s := spritesheet{
filename: "DEFAULT_SPRITE",
renderer: renderer,
texture: texture,
surface: surface,
}
return &s, nil
}