Files
ordoor/internal/assetstore/object.go
Nick Thomas 7a8e9dbd97 Respect sprite X and Y offsets
This makes menus display more correctly, and also fixes trees and other
objects on the main map, although it messes up bounds clipping (sigh).
2020-03-21 00:56:35 +00:00

90 lines
1.4 KiB
Go

package assetstore
import (
"log"
"github.com/hajimehoshi/ebiten"
"code.ur.gs/lupine/ordoor/internal/data"
)
type Object struct {
assets *AssetStore
sprites []*Sprite
raw *data.Object
}
type Sprite struct {
obj *Object
XOffset int
YOffset int
Width int
Height int
Image *ebiten.Image
}
func (a *AssetStore) Object(name string) (*Object, error) {
name = canonical(name)
if obj, ok := a.objs[name]; ok {
return obj, nil
}
log.Printf("Loading object %v", name)
filename, err := a.lookup(name, "obj", "Obj")
if err != nil {
return nil, err
}
raw, err := data.LoadObjectLazily(filename)
if err != nil {
return nil, err
}
raw.Name = name
obj := &Object{
assets: a,
sprites: make([]*Sprite, int(raw.NumSprites)),
raw: raw,
}
a.objs[name] = obj
return obj, nil
}
// Filled lazily
func (o *Object) Sprite(idx int) (*Sprite, error) {
if sprite := o.sprites[idx]; sprite != nil {
return sprite, nil
}
log.Printf("Loading sprite %v:%v", o.raw.Name, idx)
if o.raw.Sprites[idx] == nil {
if err := o.raw.LoadSprite(idx); err != nil {
return nil, err
}
}
raw := o.raw.Sprites[idx]
img, err := ebiten.NewImageFromImage(raw.ToImage(), ebiten.FilterDefault)
if err != nil {
return nil, err
}
sprite := &Sprite{
obj: o,
Width: int(raw.Width),
Height: int(raw.Width),
XOffset: int(raw.XOffset),
YOffset: int(raw.YOffset),
Image: img,
}
o.sprites[idx] = sprite
return sprite, nil
}