parallax and interfaces

This commit is contained in:
Josh Deprez 2021-08-18 16:34:51 +10:00
parent 3b452fc3d0
commit 88482c390d
14 changed files with 136 additions and 21 deletions

BIN
asset_src/purple-space.jpeg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

BIN
assets/space.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 472 KiB

View file

@ -5,6 +5,9 @@ import (
"image"
)
// Ensure Actor satisfies interfaces.
var _ Prepper = &Actor{}
func init() {
gob.Register(Actor{})
}

View file

@ -1,11 +1,25 @@
package engine
import (
"encoding/gob"
"image"
"github.com/hajimehoshi/ebiten/v2"
)
// Ensure Camera satisfies interfaces.
var (
_ Identifier = &Camera{}
_ Drawer = &Camera{}
_ Prepper = &Camera{}
_ Scanner = &Camera{}
_ Updater = &Camera{}
)
func init() {
gob.Register(Camera{})
}
// Camera models a camera that is viewing a scene.
// Changes to the configuration take effect immediately.
// Camera ignores Scene.Draw and calls Scene's children's Draw.
@ -74,8 +88,8 @@ func (c *Camera) Draw(screen *ebiten.Image, opts ebiten.DrawImageOptions) {
for _, i := range c.Scene.Components {
if d, ok := i.(Drawer); ok {
cs := 1.0
if s, ok := i.(CoordScaler); ok {
cs = s.CoordScale()
if s, ok := i.(ParallaxScaler); ok {
cs = s.ParallaxFactor()
}
var geom ebiten.GeoM
// 1. Move centre to the origin, subject to CoordScale

View file

@ -13,6 +13,14 @@ import (
"github.com/hajimehoshi/ebiten/v2/ebitenutil"
)
var (
_ Drawer = PerfDisplay{}
_ DrawOrderer = PerfDisplay{}
_ Prepper = &GobDumper{}
_ Updater = &GobDumper{}
)
func init() {
gob.Register(GobDumper{})
gob.Register(PerfDisplay{})

View file

@ -6,10 +6,13 @@ import (
"github.com/hajimehoshi/ebiten/v2"
)
// Ensure Fill satisfies Drawer.
var _ Drawer = &Fill{}
// Fill fills the screen with a colour.
type Fill struct {
Color color.Color
DrawOrder
ZOrder
Hidden bool
ID
}

38
engine/image.go Normal file
View file

@ -0,0 +1,38 @@
package engine
import (
"encoding/gob"
"image"
"github.com/hajimehoshi/ebiten/v2"
)
// Ensure Image satisfies interfaces.
var (
_ Identifier = &Image{}
_ Drawer = &Image{}
_ DrawOrderer = &Image{}
_ ParallaxScaler = &Image{}
)
func init() {
gob.Register(Image{})
}
// Image draws an image at a position.
type Image struct {
ID
Parallax
ZOrder
Src ImageRef
Pos image.Point
}
// Draw draws the image.
func (i *Image) Draw(screen *ebiten.Image, opts ebiten.DrawImageOptions) {
var geom ebiten.GeoM
geom.Translate(float64(i.Pos.X), float64(i.Pos.Y))
geom.Concat(opts.GeoM)
opts.GeoM = geom
screen.DrawImage(i.Src.Image(), &opts)
}

View file

@ -11,10 +11,10 @@ type Collider interface {
CollidesWith(image.Rectangle) bool
}
// CoordScaler components have a scaling factor. This is used for
// e.g. parallax layers in a scene, and can be thought of as 1/distance.
type CoordScaler interface {
CoordScale() float64
// ParallaxScaler components have a scaling factor. This is used for
// parallax layers in a scene, and can be thought of as 1/distance.
type ParallaxScaler interface {
ParallaxFactor() float64
}
// Drawer components can draw themselves. Draw is called often.

View file

@ -6,8 +6,14 @@ type ID string
// Ident returns id as a string.
func (id ID) Ident() string { return string(id) }
// DrawOrder implements DrawOrderer directly (as a float64 value).
type DrawOrder float64
// Parallax implements ParallaxScaler directly (as a float64 value).
type Parallax float64
// ParallaxFactor returns s as a float64.
func (s Parallax) ParallaxFactor() float64 { return float64(s) }
// ZOrder implements DrawOrderer directly (as a float64 value).
type ZOrder float64
// DrawOrder returns z as a float64.
func (z DrawOrder) DrawOrder() float64 { return float64(z) }
func (z ZOrder) DrawOrder() float64 { return float64(z) }

View file

@ -8,6 +8,16 @@ import (
"github.com/hajimehoshi/ebiten/v2"
)
// Ensure Scene satisfies interfaces.
var (
_ Identifier = &Scene{}
_ Drawer = &Scene{}
_ DrawOrderer = &Scene{}
_ Prepper = &Scene{}
_ Scanner = &Scene{}
_ Updater = &Scene{}
)
func init() {
gob.Register(Scene{})
}
@ -16,7 +26,7 @@ func init() {
type Scene struct {
Components []interface{}
Disabled bool
DrawOrder
ZOrder
Hidden bool
ID
}

View file

@ -5,6 +5,8 @@ import (
"image"
)
var _ Collider = SolidRect{}
func init() {
gob.Register(SolidRect{})
}

View file

@ -7,6 +7,15 @@ import (
"github.com/hajimehoshi/ebiten/v2"
)
// Ensure Sprite satisfies interfaces.
var (
_ Identifier = &Sprite{}
_ Drawer = &Sprite{}
_ DrawOrderer = &Sprite{}
_ Scanner = &Sprite{}
_ Updater = &Sprite{}
)
func init() {
gob.Register(Sprite{})
}
@ -14,7 +23,7 @@ func init() {
// Sprite combines an Actor with the ability to Draw from a single spritesheet.
type Sprite struct {
Actor
DrawOrder
ZOrder
FrameSize image.Point
FrameOffset image.Point
Hidden bool

View file

@ -7,6 +7,15 @@ import (
"github.com/hajimehoshi/ebiten/v2"
)
// Ensure Tilemap satisfies interfaces.
var (
_ Identifier = &Tilemap{}
_ Collider = &Tilemap{}
_ Drawer = &Tilemap{}
_ DrawOrderer = &Tilemap{}
_ Updater = &Tilemap{}
)
func init() {
gob.Register(AnimatedTile{})
gob.Register(StaticTile(0))
@ -16,7 +25,7 @@ func init() {
// Tilemap renders a grid of tiles.
type Tilemap struct {
Disabled bool
DrawOrder
ZOrder
Hidden bool
ID
Map map[image.Point]Tile
@ -114,6 +123,12 @@ type Tile interface {
TileIndex() int
}
// Ensure StaticTile and AnimatedTile satisfy Tile.
var (
_ Tile = StaticTile(0)
_ Tile = &AnimatedTile{}
)
// StaticTile returns a fixed tile index.
type StaticTile int

13
main.go
View file

@ -52,11 +52,18 @@ func main() {
Components: []interface{}{
&engine.Fill{
Color: color.Gray{100},
DrawOrder: 0,
ZOrder: 0,
},
&engine.Image{
ID: "bg_image",
Parallax: 0.5,
ZOrder: 1,
Pos: image.Pt(-160, -120),
Src: engine.ImageRef{Path: "assets/space.png"},
},
&engine.Tilemap{
ID: "terrain",
DrawOrder: 1,
ZOrder: 2,
Map: tiles,
Src: engine.ImageRef{Path: "assets/boxes.png"},
TileSize: 16,
@ -82,7 +89,7 @@ func main() {
Pos: image.Pt(100, 100),
Size: image.Pt(8, 16),
},
DrawOrder: 2,
ZOrder: 3,
FrameOffset: image.Pt(-1, 0),
FrameSize: image.Pt(10, 16),
Src: engine.ImageRef{Path: "assets/aw.png"},