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

85 lines
1.5 KiB
Go

package sprite
import (
"fmt"
"log"
"github.com/veandco/go-sdl2/img"
"github.com/veandco/go-sdl2/sdl"
)
type sprite struct {
filename string
renderer *sdl.Renderer
image *sdl.Surface // the original png file
spriteSheet *sdl.Texture // the SDL texture created from the image
}
func NewSprite(renderer *sdl.Renderer, filename string) (*sprite, error) {
var err error
// Load the image file
var image *sdl.Surface
sdl.Do(func() {
image, err = img.Load(filename)
})
if err != nil {
err = fmt.Errorf("failed to load image: %w", err)
return nil, err
}
// Create the sprite sheet texture from the image
var spriteSheet *sdl.Texture
sdl.Do(func() {
spriteSheet, err = renderer.CreateTextureFromSurface(image)
})
if err != nil {
err = fmt.Errorf("failed to create texture: %w", err)
return nil, err
}
s := sprite{
filename: filename,
renderer: renderer,
image: image,
spriteSheet: spriteSheet,
}
return &s, nil
}
func (s *sprite) Cleanup() {
// Clean up image
defer func() {
if s.image != nil {
sdl.Do(func() {
s.image.Free()
})
}
}()
// Clean up spritesheet
defer func() {
if s.spriteSheet != nil {
sdl.Do(func() {
err := s.spriteSheet.Destroy()
if err != nil {
log.Printf("error destroying spritesheet %v: %v\n", s.filename, err)
}
})
}
}()
}
func (s *sprite) Draw(section *sdl.Rect, placement *sdl.Rect) error {
var err error
sdl.Do(func() {
err = s.renderer.Copy(s.spriteSheet, section, placement)
})
if err != nil {
return err
}
return nil
}