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:
2020-03-21 00:56:35 +00:00
parent eb5c4430e8
commit 7a8e9dbd97
10 changed files with 109 additions and 55 deletions

View File

@@ -4,8 +4,6 @@ import (
"image"
"log"
"github.com/hajimehoshi/ebiten"
"code.ur.gs/lupine/ordoor/internal/maps"
)
@@ -64,11 +62,11 @@ func (a *AssetStore) Map(name string) (*Map, error) {
return m, nil
}
// ImagesForCell returns the sprites needed to correctly render this cell.
// SpritesForCell returns the sprites needed to correctly render this cell.
// They should be rendered from first to last to get the correct ordering
func (m *Map) ImagesForCell(x, y, z int) ([]*ebiten.Image, error) {
func (m *Map) SpritesForCell(x, y, z int) ([]*Sprite, error) {
cell := m.raw.At(x, y, z)
images := make([]*ebiten.Image, 0, 4)
sprites := make([]*Sprite, 0, 4)
for _, ref := range []maps.ObjRef{cell.Surface, cell.Right, cell.Left, cell.Center} {
if !ref.IsActive() {
@@ -80,13 +78,13 @@ func (m *Map) ImagesForCell(x, y, z int) ([]*ebiten.Image, error) {
return nil, err
}
img, err := obj.Image(ref.Sprite())
sprite, err := obj.Sprite(ref.Sprite())
if err != nil {
return nil, err
}
images = append(images, img)
sprites = append(sprites, sprite)
}
return images, nil
return sprites, nil
}

View File

@@ -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
}