package assetstore import ( "log" "github.com/hajimehoshi/ebiten" "code.ur.gs/lupine/ordoor/internal/data" ) type Object struct { assets *AssetStore images []*ebiten.Image raw *data.Object } 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, images: make([]*ebiten.Image, int(raw.NumSprites)), raw: raw, } a.objs[name] = obj return obj, nil } // Filled lazily func (o *Object) Image(idx int) (*ebiten.Image, error) { if img := o.images[idx]; img != nil { return img, 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 } } stdImg := o.raw.Sprites[idx].ToImage() img, err := ebiten.NewImageFromImage(stdImg, ebiten.FilterDefault) if err != nil { return nil, err } o.images[idx] = img return img, nil }