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

81 lines
1.5 KiB
Go

package sprite
import (
"log"
"github.com/veandco/go-sdl2/sdl"
)
var spriteFileList []string = []string{
"assets/images/penguin.png",
}
type Sprite interface {
Draw(section *sdl.Rect, placement *sdl.Rect) error
Cleanup()
}
var SpriteCache map[string]Sprite
var DefaultSprite Sprite
func InitSpriteCache(renderer *sdl.Renderer) error {
var err error
DefaultSprite, err = createDefaultSprite(renderer)
if err != nil {
log.Printf("failed to create DefaultSprite: %v", err)
return err
}
SpriteCache = make(map[string]Sprite)
for _, filename := range spriteFileList {
s, err := NewSprite(renderer, filename)
if err != nil {
log.Printf("error creating sprite %v, using DefaultSprite: %v", filename, err)
SpriteCache[filename] = DefaultSprite
} else {
SpriteCache[filename] = s
}
}
return nil
}
func GetSprite(filename string) Sprite {
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()
}
}
func createDefaultSprite(renderer *sdl.Renderer) (*sprite, 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 := sprite{
renderer: renderer,
spriteSheet: texture,
}
return &s, nil
}