76 lines
1.4 KiB
Go
76 lines
1.4 KiB
Go
package sprite
|
|
|
|
import (
|
|
"log"
|
|
|
|
"github.com/veandco/go-sdl2/sdl"
|
|
)
|
|
|
|
var (
|
|
spriteCache map[string]*spritesheet
|
|
defaultSprite *spritesheet
|
|
)
|
|
|
|
func InitSpriteCache(renderer *sdl.Renderer) error {
|
|
spriteCache = make(map[string]*spritesheet)
|
|
|
|
for _, filename := range SPRITE_FILE_LIST {
|
|
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
|
|
}
|