93 lines
1.6 KiB
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, §ion, &placement, angle, ¢er, 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,
|
|
}
|
|
}
|