+357
Diff
round #0
+19
screenmanager/README.md
+19
screenmanager/README.md
···
1
+
# Screen Manager
2
+
3
+
This is an example on how to use multiple screens within a game.
4
+
5
+
Each screen owns its own
6
+
7
+
* `Update()` logic
8
+
* `Render()` logic
9
+
* `OnEnter()` logic
10
+
11
+
A possible extension would be an `OnExit()` logic.
12
+
13
+
## Screens
14
+
15
+
- `ScreenGame`: The main game screen/Start Screen. Obviously this is up to you whether you want to have a splash screen here or draw the main game.
16
+
- `ScreenE`: The screen for the "E" key.
17
+
- `ScreenS`: The screen for the "S" key.
18
+
- `ScreenN`: The screen for the "N" key.
19
+
- `ScreenW`: The screen for the "W" key.
screenmanager/eg_6x10.fff
screenmanager/eg_6x10.fff
This is a binary file and will not be displayed.
+8
screenmanager/firefly.toml
+8
screenmanager/firefly.toml
+49
screenmanager/game.go
+49
screenmanager/game.go
···
1
+
package main
2
+
3
+
import (
4
+
"github.com/firefly-zero/firefly-go/firefly"
5
+
ff "github.com/firefly-zero/firefly-go/firefly"
6
+
)
7
+
8
+
type Game struct {
9
+
Screen ScreenManager
10
+
}
11
+
12
+
func (g *Game) OnEnter() {
13
+
}
14
+
15
+
func (g *Game) Draw() {
16
+
xCenter := GetTextCenterAtX(firefly.Width, ScreenGame.String(), FONT)
17
+
18
+
firefly.DrawText(
19
+
ScreenGame.String(),
20
+
FONT,
21
+
firefly.Point{X: xCenter, Y: 10},
22
+
firefly.ColorWhite,
23
+
)
24
+
}
25
+
26
+
func (g *Game) HandleInput() {
27
+
buttons := firefly.ReadButtons(ff.Combined)
28
+
29
+
if buttons.N {
30
+
GAME.Screen.SetScreen(ScreenN)
31
+
}
32
+
if buttons.E {
33
+
GAME.Screen.SetScreen(ScreenE)
34
+
}
35
+
if buttons.S {
36
+
GAME.Screen.SetScreen(ScreenS)
37
+
}
38
+
if buttons.W {
39
+
GAME.Screen.SetScreen(ScreenW)
40
+
}
41
+
}
42
+
43
+
func (g *Game) Update() {
44
+
g.HandleInput()
45
+
}
46
+
47
+
func (g *Game) Render() {
48
+
g.Draw()
49
+
}
+7
screenmanager/go.mod
+7
screenmanager/go.mod
+4
screenmanager/go.sum
+4
screenmanager/go.sum
···
1
+
github.com/firefly-zero/firefly-go v0.11.0 h1:+Y5EE0sXxjylZo9H3U3+VpPU1bCXdq0q7xnrpn207pg=
2
+
github.com/firefly-zero/firefly-go v0.11.0/go.mod h1:osit9/kxcqSUBVozePb7LNzOHy3FQ7ii1Z0mL82pWu0=
3
+
github.com/orsinium-labs/tinymath v1.1.0 h1:KomdsyLHB7vE3f1nRAJF2dyf1m/gnM2HxfTeV1vS5UA=
4
+
github.com/orsinium-labs/tinymath v1.1.0/go.mod h1:WPXX6ei3KSXG7JfA03a+ekCYaY9SWN4I+JRl2p6ck+A=
+7
screenmanager/helpers.go
+7
screenmanager/helpers.go
+24
screenmanager/main.go
+24
screenmanager/main.go
···
1
+
package main
2
+
3
+
import "github.com/firefly-zero/firefly-go/firefly"
4
+
5
+
var (
6
+
FONT firefly.Font
7
+
GAME = Game{}
8
+
)
9
+
10
+
func init() {
11
+
firefly.Boot = boot
12
+
firefly.Update = GAME.Screen.Update
13
+
firefly.Render = GAME.Screen.Render
14
+
}
15
+
16
+
func boot() {
17
+
FONT = firefly.LoadFile("font", nil).Font()
18
+
19
+
GAME.Screen.Register(ScreenGame, &GAME)
20
+
GAME.Screen.Register(ScreenE, &EScreen{})
21
+
GAME.Screen.Register(ScreenS, &SScreen{})
22
+
GAME.Screen.Register(ScreenN, &NScreen{})
23
+
GAME.Screen.Register(ScreenW, &WScreen{})
24
+
}
+43
screenmanager/screen_e.go
+43
screenmanager/screen_e.go
···
1
+
package main
2
+
3
+
import firefly "github.com/firefly-zero/firefly-go/firefly"
4
+
5
+
type EScreen struct{}
6
+
7
+
func (es *EScreen) OnEnter() {}
8
+
9
+
func (es *EScreen) Draw() {
10
+
xCenter := GetTextCenterAtX(firefly.Width, ScreenE.String(), FONT)
11
+
12
+
firefly.DrawText(
13
+
ScreenE.String(),
14
+
FONT,
15
+
firefly.Point{X: xCenter, Y: 10},
16
+
firefly.ColorWhite,
17
+
)
18
+
}
19
+
20
+
func (es *EScreen) HandleInput() {
21
+
buttons := firefly.ReadButtons(firefly.Combined)
22
+
23
+
if buttons.N {
24
+
GAME.Screen.SetScreen(ScreenN)
25
+
}
26
+
if buttons.E {
27
+
GAME.Screen.SetScreen(ScreenE)
28
+
}
29
+
if buttons.S {
30
+
GAME.Screen.SetScreen(ScreenS)
31
+
}
32
+
if buttons.W {
33
+
GAME.Screen.SetScreen(ScreenW)
34
+
}
35
+
}
36
+
37
+
func (es *EScreen) Update() {
38
+
es.HandleInput()
39
+
}
40
+
41
+
func (es *EScreen) Render() {
42
+
es.Draw()
43
+
}
+67
screenmanager/screen_manager.go
+67
screenmanager/screen_manager.go
···
1
+
package main
2
+
3
+
import (
4
+
"github.com/firefly-zero/firefly-go/firefly"
5
+
ff "github.com/firefly-zero/firefly-go/firefly"
6
+
)
7
+
8
+
type ScreenID uint8
9
+
10
+
const (
11
+
ScreenGame ScreenID = iota
12
+
ScreenE
13
+
ScreenS
14
+
ScreenN
15
+
ScreenW
16
+
)
17
+
18
+
func (s ScreenID) String() string {
19
+
switch s {
20
+
case ScreenGame:
21
+
return "Start Screen"
22
+
case ScreenE:
23
+
return "E-Screen"
24
+
case ScreenS:
25
+
return "S-Screen"
26
+
case ScreenN:
27
+
return "N-Screen"
28
+
case ScreenW:
29
+
return "W-Screen"
30
+
default:
31
+
return "Start Screen"
32
+
}
33
+
}
34
+
35
+
type IScreen interface {
36
+
Update()
37
+
Render()
38
+
OnEnter()
39
+
}
40
+
41
+
type ScreenManager struct {
42
+
current ScreenID
43
+
screens map[ScreenID]IScreen
44
+
}
45
+
46
+
func (sm *ScreenManager) Register(id ScreenID, s IScreen) {
47
+
if sm.screens == nil {
48
+
sm.screens = make(map[ScreenID]IScreen)
49
+
}
50
+
ff.LogDebug("Register " + id.String())
51
+
sm.screens[id] = s
52
+
}
53
+
54
+
func (sm *ScreenManager) SetScreen(id ScreenID) {
55
+
sm.current = id
56
+
ff.LogDebug("Setting Screen " + id.String())
57
+
sm.screens[id].OnEnter()
58
+
}
59
+
60
+
func (sm *ScreenManager) Update() {
61
+
sm.screens[sm.current].Update()
62
+
}
63
+
64
+
func (sm *ScreenManager) Render() {
65
+
firefly.ClearScreen(firefly.ColorBlack)
66
+
sm.screens[sm.current].Render()
67
+
}
+43
screenmanager/screen_n.go
+43
screenmanager/screen_n.go
···
1
+
package main
2
+
3
+
import firefly "github.com/firefly-zero/firefly-go/firefly"
4
+
5
+
type NScreen struct{}
6
+
7
+
func (ns *NScreen) OnEnter() {}
8
+
9
+
func (ns *NScreen) Draw() {
10
+
xCenter := GetTextCenterAtX(firefly.Width, ScreenN.String(), FONT)
11
+
12
+
firefly.DrawText(
13
+
ScreenN.String(),
14
+
FONT,
15
+
firefly.Point{X: xCenter, Y: 10},
16
+
firefly.ColorWhite,
17
+
)
18
+
}
19
+
20
+
func (ns *NScreen) HandleInput() {
21
+
buttons := firefly.ReadButtons(firefly.Combined)
22
+
23
+
if buttons.N {
24
+
GAME.Screen.SetScreen(ScreenN)
25
+
}
26
+
if buttons.E {
27
+
GAME.Screen.SetScreen(ScreenE)
28
+
}
29
+
if buttons.S {
30
+
GAME.Screen.SetScreen(ScreenS)
31
+
}
32
+
if buttons.W {
33
+
GAME.Screen.SetScreen(ScreenW)
34
+
}
35
+
}
36
+
37
+
func (ns *NScreen) Update() {
38
+
ns.HandleInput()
39
+
}
40
+
41
+
func (ns *NScreen) Render() {
42
+
ns.Draw()
43
+
}
+43
screenmanager/screen_s.go
+43
screenmanager/screen_s.go
···
1
+
package main
2
+
3
+
import firefly "github.com/firefly-zero/firefly-go/firefly"
4
+
5
+
type SScreen struct{}
6
+
7
+
func (ss *SScreen) OnEnter() {}
8
+
9
+
func (ss *SScreen) Draw() {
10
+
xCenter := GetTextCenterAtX(firefly.Width, ScreenS.String(), FONT)
11
+
12
+
firefly.DrawText(
13
+
ScreenS.String(),
14
+
FONT,
15
+
firefly.Point{X: xCenter, Y: 10},
16
+
firefly.ColorWhite,
17
+
)
18
+
}
19
+
20
+
func (ss *SScreen) HandleInput() {
21
+
buttons := firefly.ReadButtons(firefly.Combined)
22
+
23
+
if buttons.N {
24
+
GAME.Screen.SetScreen(ScreenN)
25
+
}
26
+
if buttons.E {
27
+
GAME.Screen.SetScreen(ScreenE)
28
+
}
29
+
if buttons.S {
30
+
GAME.Screen.SetScreen(ScreenS)
31
+
}
32
+
if buttons.W {
33
+
GAME.Screen.SetScreen(ScreenW)
34
+
}
35
+
}
36
+
37
+
func (ss *SScreen) Update() {
38
+
ss.HandleInput()
39
+
}
40
+
41
+
func (ss *SScreen) Render() {
42
+
ss.Draw()
43
+
}
+43
screenmanager/screen_w.go
+43
screenmanager/screen_w.go
···
1
+
package main
2
+
3
+
import firefly "github.com/firefly-zero/firefly-go/firefly"
4
+
5
+
type WScreen struct{}
6
+
7
+
func (ws *WScreen) OnEnter() {}
8
+
9
+
func (ws *WScreen) Draw() {
10
+
xCenter := GetTextCenterAtX(firefly.Width, ScreenW.String(), FONT)
11
+
12
+
firefly.DrawText(
13
+
ScreenW.String(),
14
+
FONT,
15
+
firefly.Point{X: xCenter, Y: 10},
16
+
firefly.ColorWhite,
17
+
)
18
+
}
19
+
20
+
func (ws *WScreen) HandleInput() {
21
+
buttons := firefly.ReadButtons(firefly.Combined)
22
+
23
+
if buttons.N {
24
+
GAME.Screen.SetScreen(ScreenN)
25
+
}
26
+
if buttons.E {
27
+
GAME.Screen.SetScreen(ScreenE)
28
+
}
29
+
if buttons.S {
30
+
GAME.Screen.SetScreen(ScreenS)
31
+
}
32
+
if buttons.W {
33
+
GAME.Screen.SetScreen(ScreenW)
34
+
}
35
+
}
36
+
37
+
func (ws *WScreen) Update() {
38
+
ws.HandleInput()
39
+
}
40
+
41
+
func (ws *WScreen) Render() {
42
+
ws.Draw()
43
+
}
History
1 round
0 comments
voigt.tngl.sh
submitted
#0
1 commit
expand
collapse
add screenmanager poc
expand 0 comments
pull request successfully merged