Hidden, Identifier, z.go->misc.go
This commit is contained in:
parent
cd7b0fae99
commit
0af9bf298c
6 changed files with 49 additions and 13 deletions
|
@ -18,9 +18,14 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// PerfDisplay debugprints CurrentTPS and CurrentFPS in the top left.
|
// PerfDisplay debugprints CurrentTPS and CurrentFPS in the top left.
|
||||||
type PerfDisplay struct{}
|
type PerfDisplay struct {
|
||||||
|
Hidden bool
|
||||||
|
}
|
||||||
|
|
||||||
func (PerfDisplay) Draw(screen *ebiten.Image, _ ebiten.GeoM) {
|
func (p PerfDisplay) Draw(screen *ebiten.Image, _ ebiten.GeoM) {
|
||||||
|
if p.Hidden {
|
||||||
|
return
|
||||||
|
}
|
||||||
ebitenutil.DebugPrint(screen, fmt.Sprintf("TPS: %0.2f FPS: %0.2f", ebiten.CurrentTPS(), ebiten.CurrentFPS()))
|
ebitenutil.DebugPrint(screen, fmt.Sprintf("TPS: %0.2f FPS: %0.2f", ebiten.CurrentTPS(), ebiten.CurrentFPS()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ package engine
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/gob"
|
"encoding/gob"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
"github.com/hajimehoshi/ebiten/v2"
|
"github.com/hajimehoshi/ebiten/v2"
|
||||||
)
|
)
|
||||||
|
@ -10,10 +11,10 @@ func init() {
|
||||||
gob.Register(Game{})
|
gob.Register(Game{})
|
||||||
}
|
}
|
||||||
|
|
||||||
// IDer components have a name. This makes it easier for components to
|
// Identifier components have a sense of self. This makes it easier for
|
||||||
// find and interact with one another.
|
// components to find and interact with one another.
|
||||||
type IDer interface {
|
type Identifier interface {
|
||||||
ID() string
|
Ident() string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scanner components can be scanned. It is called when the game
|
// Scanner components can be scanned. It is called when the game
|
||||||
|
@ -47,6 +48,20 @@ func (g *Game) Update() error {
|
||||||
return g.Scene.Update()
|
return g.Scene.Update()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RegisterComponent tells the game there is a new component.
|
||||||
|
func (g *Game) RegisterComponent(c interface{}) {
|
||||||
|
if id, ok := c.(Identifier); ok {
|
||||||
|
g.componentsByID[id.Ident()] = c
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnregisterComponent tells the game the component is no more.
|
||||||
|
func (g *Game) UnregisterComponent(c interface{}) {
|
||||||
|
if id, ok := c.(Identifier); ok {
|
||||||
|
delete(g.componentsByID, id.Ident())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Component returns the component with a given ID.
|
// Component returns the component with a given ID.
|
||||||
func (g *Game) Component(id string) interface{} { return g.componentsByID[id] }
|
func (g *Game) Component(id string) interface{} { return g.componentsByID[id] }
|
||||||
|
|
||||||
|
@ -71,12 +86,10 @@ func (g *Game) walk(c interface{}, v func(interface{}) bool) {
|
||||||
|
|
||||||
// Build builds the component database.
|
// Build builds the component database.
|
||||||
func (g *Game) Build() {
|
func (g *Game) Build() {
|
||||||
byID := make(map[string]interface{})
|
g.componentsByID = make(map[string]interface{})
|
||||||
g.walk(g.Scene, func(c interface{}) bool {
|
g.Walk(func(c interface{}) bool {
|
||||||
if id, ok := c.(IDer); ok {
|
g.RegisterComponent(c)
|
||||||
byID[id.ID()] = c
|
|
||||||
}
|
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
g.componentsByID = byID
|
fmt.Printf("%#v\n", g.componentsByID)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,11 @@
|
||||||
package engine
|
package engine
|
||||||
|
|
||||||
|
// ID implements Identifier directly (as a string value).
|
||||||
|
type ID string
|
||||||
|
|
||||||
|
// Ident returns id as a string.
|
||||||
|
func (id ID) Ident() string { return string(id) }
|
||||||
|
|
||||||
// ZPos implements ZPositioner directly (as a float64 value).
|
// ZPos implements ZPositioner directly (as a float64 value).
|
||||||
type ZPos float64
|
type ZPos float64
|
||||||
|
|
|
@ -30,11 +30,17 @@ type ZPositioner interface {
|
||||||
// Scene manages drawing and updating a bunch of components.
|
// Scene manages drawing and updating a bunch of components.
|
||||||
type Scene struct {
|
type Scene struct {
|
||||||
Components []interface{}
|
Components []interface{}
|
||||||
Transform ebiten.GeoM
|
Hidden bool
|
||||||
|
ID
|
||||||
|
Transform ebiten.GeoM
|
||||||
|
ZPos
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw draws all components in order.
|
// Draw draws all components in order.
|
||||||
func (s *Scene) Draw(screen *ebiten.Image, geom ebiten.GeoM) {
|
func (s *Scene) Draw(screen *ebiten.Image, geom ebiten.GeoM) {
|
||||||
|
if s.Hidden {
|
||||||
|
return
|
||||||
|
}
|
||||||
geom.Concat(s.Transform)
|
geom.Concat(s.Transform)
|
||||||
for _, i := range s.Components {
|
for _, i := range s.Components {
|
||||||
if d, ok := i.(Drawer); ok {
|
if d, ok := i.(Drawer); ok {
|
||||||
|
|
|
@ -15,6 +15,8 @@ func init() {
|
||||||
|
|
||||||
// Tilemap renders a grid of tiles.
|
// Tilemap renders a grid of tiles.
|
||||||
type Tilemap struct {
|
type Tilemap struct {
|
||||||
|
Hidden bool
|
||||||
|
ID
|
||||||
Map [][]Tile
|
Map [][]Tile
|
||||||
Src ImageRef // must be a horizontal tile set
|
Src ImageRef // must be a horizontal tile set
|
||||||
TileSize int
|
TileSize int
|
||||||
|
@ -24,6 +26,9 @@ type Tilemap struct {
|
||||||
|
|
||||||
// Draw draws the tilemap.
|
// Draw draws the tilemap.
|
||||||
func (t *Tilemap) Draw(screen *ebiten.Image, geom ebiten.GeoM) {
|
func (t *Tilemap) Draw(screen *ebiten.Image, geom ebiten.GeoM) {
|
||||||
|
if t.Hidden {
|
||||||
|
return
|
||||||
|
}
|
||||||
geom.Concat(t.Transform)
|
geom.Concat(t.Transform)
|
||||||
for j, row := range t.Map {
|
for j, row := range t.Map {
|
||||||
for i, tile := range row {
|
for i, tile := range row {
|
||||||
|
|
1
main.go
1
main.go
|
@ -74,6 +74,7 @@ func main() {
|
||||||
ScreenHeight: screenHeight,
|
ScreenHeight: screenHeight,
|
||||||
ScreenWidth: screenWidth,
|
ScreenWidth: screenWidth,
|
||||||
Scene: &engine.Scene{
|
Scene: &engine.Scene{
|
||||||
|
ID: "root_scene",
|
||||||
Components: []interface{}{
|
Components: []interface{}{
|
||||||
&engine.GobDumper{
|
&engine.GobDumper{
|
||||||
KeyCombo: []ebiten.Key{
|
KeyCombo: []ebiten.Key{
|
||||||
|
|
Loading…
Reference in a new issue