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