81 lines
1.5 KiB
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
|
|
}
|