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

93 lines
1.6 KiB
Go

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