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 }