/
main.go
139 lines (108 loc) · 2.73 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package main
import (
"fmt"
"log"
"github.com/ebitenui/ebitenui"
"github.com/ebitenui/ebitenui/widget"
"github.com/hajimehoshi/ebiten/v2"
"github.com/hajimehoshi/ebiten/v2/ebitenutil"
)
const (
screenWidth = 640
screenHeight = 480
)
type Game struct {
ui *ebitenui.UI
arrow *character
}
type Screen int
type SwitchScreenFunc func(Screen)
const (
Title Screen = 0
Arcade Screen = 1
Options Screen = 2
)
var currentScreen Screen = Title
func createUI(char *character, onScreenChanged func(Screen, *character)) (*ebitenui.UI, func(), error) {
res, err := loadUIResources()
if err != nil {
return nil, nil, err
}
rootContainer := widget.NewContainer(
widget.ContainerOpts.Layout(widget.NewAnchorLayout(widget.AnchorLayoutOpts.Padding(widget.Insets{
Top: 20,
Bottom: 20,
}))),
widget.ContainerOpts.BackgroundImage(res.background))
flipBook := widget.NewFlipBook(widget.FlipBookOpts.ContainerOpts(
widget.ContainerOpts.WidgetOpts(widget.WidgetOpts.LayoutData(widget.AnchorLayoutData{StretchHorizontal: true, StretchVertical: true})),
))
rootContainer.AddChild(flipBook)
var ui *ebitenui.UI
ui = &ebitenui.UI{
Container: rootContainer,
}
var titleScreen, arcadeScreen, optionsScreen widget.PreferredSizeLocateableWidget
switchScreen := func(screen Screen) {
onScreenChanged(screen, char)
switch screen {
case Title:
flipBook.SetPage(titleScreen)
case Arcade:
flipBook.SetPage(arcadeScreen)
case Options:
flipBook.SetPage(optionsScreen)
}
}
titleScreen = titleScreenContainer(res, switchScreen)
arcadeScreen = arcadeScreenContainer(res, switchScreen)
optionsScreen = optionsScreenContainer(res, switchScreen)
flipBook.SetPage(titleScreen)
return ui, func() {
res.close()
}, nil
}
func (game *Game) Update() error {
game.ui.Update()
switch currentScreen {
case Arcade:
game.arrow.update()
}
return nil
}
func (game *Game) Draw(screen *ebiten.Image) {
game.ui.Draw(screen)
msg := fmt.Sprintf("FPS: %0.2f", ebiten.ActualFPS())
ebitenutil.DebugPrint(screen, msg)
switch currentScreen {
case Arcade:
game.arrow.draw(screen)
}
}
func (game *Game) Layout(outsideWidth, outsideHeight int) (int, int) {
return screenWidth, screenHeight
}
func main() {
ebiten.SetWindowSize(screenWidth, screenHeight)
ebiten.SetWindowTitle("Game Menu Demo")
arrow, err := createArrow()
onScreenChanged := func(screen Screen, char *character) {
currentScreen = screen
switch screen {
case Arcade:
{
char.x = screenWidth / 2
char.y = screenHeight / 2
char.dir = up
}
}
}
ui, closeUI, err := createUI(arrow, onScreenChanged)
if err != nil {
log.Fatal(err)
}
defer closeUI()
if err := ebiten.RunGame(&Game{ui: ui, arrow: arrow}); err != nil {
log.Fatal(err)
}
}