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() {
sdl.Do(func() {
// Clean up spritesheet
if s.texture != nil {
err := s.texture.Destroy()
if err != nil {
log.Printf("error destroying spritesheet %v: %v\n", s.filename, err)
}
}
// Clean up image
if s.surface != nil {
s.surface.Free()
}
})
}
func (s *spritesheet) Draw(
section sdl.Rect,
placement sdl.Rect,
angle float64,
center sdl.Point,
flip sdl.RendererFlip,
) error {
var err error
sdl.Do(func() {
err = s.renderer.CopyEx(s.texture, &section, &placement, angle, &center, flip)
})
if err != nil {
return err
}
return nil
}
func (s *spritesheet) Bounds() sdl.Point {
return sdl.Point{
X: s.surface.W,
Y: s.surface.H,
}
}