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).
This commit is contained in:
@@ -9,12 +9,23 @@ import (
|
||||
)
|
||||
|
||||
type Object struct {
|
||||
assets *AssetStore
|
||||
images []*ebiten.Image
|
||||
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)
|
||||
|
||||
@@ -35,9 +46,9 @@ func (a *AssetStore) Object(name string) (*Object, error) {
|
||||
raw.Name = name
|
||||
|
||||
obj := &Object{
|
||||
assets: a,
|
||||
images: make([]*ebiten.Image, int(raw.NumSprites)),
|
||||
raw: raw,
|
||||
assets: a,
|
||||
sprites: make([]*Sprite, int(raw.NumSprites)),
|
||||
raw: raw,
|
||||
}
|
||||
a.objs[name] = obj
|
||||
|
||||
@@ -45,11 +56,11 @@ func (a *AssetStore) Object(name string) (*Object, error) {
|
||||
}
|
||||
|
||||
// Filled lazily
|
||||
func (o *Object) Image(idx int) (*ebiten.Image, error) {
|
||||
if img := o.images[idx]; img != nil {
|
||||
return img, nil
|
||||
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)
|
||||
log.Printf("Loading sprite %v:%v", o.raw.Name, idx)
|
||||
|
||||
if o.raw.Sprites[idx] == nil {
|
||||
if err := o.raw.LoadSprite(idx); err != nil {
|
||||
@@ -57,13 +68,22 @@ func (o *Object) Image(idx int) (*ebiten.Image, error) {
|
||||
}
|
||||
}
|
||||
|
||||
stdImg := o.raw.Sprites[idx].ToImage()
|
||||
img, err := ebiten.NewImageFromImage(stdImg, ebiten.FilterDefault)
|
||||
raw := o.raw.Sprites[idx]
|
||||
img, err := ebiten.NewImageFromImage(raw.ToImage(), ebiten.FilterDefault)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
o.images[idx] = img
|
||||
sprite := &Sprite{
|
||||
obj: o,
|
||||
Width: int(raw.Width),
|
||||
Height: int(raw.Width),
|
||||
XOffset: int(raw.XOffset),
|
||||
YOffset: int(raw.YOffset),
|
||||
Image: img,
|
||||
}
|
||||
|
||||
return img, nil
|
||||
o.sprites[idx] = sprite
|
||||
|
||||
return sprite, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user